Java快速排序,堆排序,歸并排序,希爾排序等排序算法的實現

ecfc 9年前發布 | 2K 次閱讀 Java

import java.io.File;
import java.io.IOException;
import java.sql.Time;
import java.util.Random;

/**

  • @author sky
  • 該類給出各種排序算法 /

public class sort{ private static Integer[] elem(int n){ int N=n; Random random=new Random(); Integer elem[]=new Integer[N]; for (int i=0;i<N;i++){ elem[i]=random.nextInt(1000); } return elem; } public static void main (String Args[]) throws InterruptedException{ int n=30000; Integer elem[]=elem(n); long start,end;

    class sort0 extends Thread{
        Integer elem[];
        int n;
        sort0(Integer elem[],int n){
            this.elem=elem;
            this.n=n;
        }
        public void run(){
            System.out.println("線程啟動");
            straightInsertSort(elem,n);
        }
    }

    elem=elem(n);
    start=System.currentTimeMillis();
    sort0 s1=new sort0(elem,n);

    elem=elem(n);
    sort0 s2=new sort0(elem,n);
    elem=elem(n);
    sort0 s3=new sort0(elem,n);
    elem=elem(n);
    sort0 s4=new sort0(elem,n);
    elem=elem(n);
    sort0 s5=new sort0(elem,n);
    s1.start();
    s2.start();
    s3.start();
    s4.start();
    s5.start();
    s2.join();
    s1.join();
    s3.join();
    s4.join();
    s5.join();
    System.out.println("多線程簡單插入排序:");
    end=System.currentTimeMillis();

    System.out.println(end-start);

    elem=elem(n);
    start=System.currentTimeMillis();
    straightInsertSort(elem,n);
    end=System.currentTimeMillis();
    System.out.println("簡單插入排序:");
    System.out.println(end-start);

    elem=elem(n);
    start=System.currentTimeMillis();
    shellSort(elem,n);
    end=System.currentTimeMillis();
    System.out.println("希爾排序:");
    System.out.println(end-start);

    elem=elem(n);
    start=System.currentTimeMillis();
    bubbleSort(elem,n);
    end=System.currentTimeMillis();
    System.out.println("冒泡排序:");
    System.out.println(end-start);

    /*
    elem=elem(n);
    start=System.currentTimeMillis();
    quickSort(elem,n);
    end=System.currentTimeMillis();
    System.out.println("快速排序:");
    System.out.println(end-start);*/

    elem=elem(n);
    start=System.currentTimeMillis();
    simpleSelectionSort(elem,n);
    end=System.currentTimeMillis();
    System.out.println("簡單選擇排序:");
    System.out.println(end-start);

    elem=elem(n);
    start=System.currentTimeMillis();
    heapSort(elem,n);
    end=System.currentTimeMillis();
    System.out.println("堆排序:");
    System.out.println(end-start);

    elem=elem(n);
    start=System.currentTimeMillis();
    mergeSort(elem,n);
    end=System.currentTimeMillis();
    System.out.println("歸并排序:");
    System.out.println(end-start);
}

//顯示排序結果
public static <T extends Comparable<? super T>> void show(T[] elem,int n){
    for (int i=0;i<n;i++){
        System.out.print(elem[i]);
        System.out.print(' ');
    }
    System.out.println();
}
//交換元素
private static <T extends Comparable<? super T>> void swap(T[] elem,int i,int j){
    T tmp=elem[i];
    elem[i]=elem[j];
    elem[j]=tmp;
}
//直接插入排序法,復雜度為O(n^2)
public static <T extends Comparable<? super T>> void straightInsertSort (T elem[],int n){
    for (int i=1;i<n;i++){
        T e=elem[i];
        int j;
        for (j=i-1;j>=0 && e.compareTo(elem[j])<0;j--){
            elem[j+1]=elem[j];
        }
        elem[j+1]=e;
    }
}
//shell插入排序算法,復雜度為O(n^1.5)
private static <T extends Comparable<? super T>> void  shellInsertHelp(T elem[],int n,int incr){
    for (int i=incr;i<n;i++){
        T e=elem[i];
        int j=i-incr;
        for (;j>=0 && e.compareTo(elem[j])<0;j=j-incr){
            elem[j+incr]=elem[j];
        }
        elem[j+incr]=e;

    }
}
public static <T extends Comparable<? super T>> void shellSort(T elem[],int n ){
    for (int incr=n/2;incr>0;incr=incr/2){
        shellInsertHelp(elem,n,incr);
    }
}
//冒泡排序算法,時間復雜度為O(n^2)
public static <T extends Comparable<? super T>> void bubbleSort(T elem[],int n){
    for (int i=n-1;i>0;i--){
        for (int j=0;j<i;j++){
            if (elem[j].compareTo(elem[i])>0){
                swap(elem,i,j);
            }
        }
    }
}
//快速排序算法,時間復雜度為O(n*log(n))
private static <T extends Comparable<? super T>> int partition(T elem[],int low,int high){
    while (low<high){
        for (;elem[high].compareTo(elem[low])>=0 && low<high;high--);
        swap(elem,high,low);
        for (;elem[high].compareTo(elem[low])>=0 && low<high;low++);
        swap(elem,high,low);
    }
    return low;
}
private static <T extends Comparable<? super T>> void quickSortHelp(T elem[],int low,int high){
    if (low<high){
        int pivot=partition(elem,low,high);
        quickSortHelp(elem,low,pivot-1);
        quickSortHelp(elem,pivot+1,high);
    }
}
public static <T extends Comparable<? super T>> void quickSort(T elem[],int n){
    quickSortHelp(elem,0,n-1);
}
//簡單選擇排序算法,時間復雜度為O(n^2)
public static <T extends Comparable<? super T>> void simpleSelectionSort(T elem[],int n){
    for (int i=0;i<n-1;i++){
        int lowIdx=i;
        for (int j=i+1;j<n;j++){
            if (elem[lowIdx].compareTo(elem[j])>0)
                lowIdx=j;
        }
        swap(elem,lowIdx,i);
    }
}
//堆排序,時間復雜度為O(n*log(n))
private static <T extends Comparable<? super T>> void heapAdjust(T elem[],int low,int high){
    for (int i=low,lhs=2*i+1 ;lhs<=high;lhs=2*i+1){
        if (lhs<high && elem[lhs].compareTo(elem[lhs+1])<0)lhs++;
        if (elem[i].compareTo(elem[lhs])<0){
            swap(elem,i,lhs);
            i=lhs;
        }else break;
    }
}
public static <T extends Comparable<? super T>> void heapSort(T elem[],int n){
    //初始化堆
    for (int i=(n-2)/2;i>=0;i--){
        heapAdjust(elem,i,n-1);
    }
    swap(elem,0,n-1);
    //排序
    for (int i=n-2;i>0;--i){
        heapAdjust(elem,0,i);
        swap(elem,0,i);
    }
}
//歸并排序算法,時間復雜度為O(n*log(n))
private static <T extends Comparable<? super T>> void simpleMerge(T elem[],T tmpElem[],int low ,int mid, int high){
    int i=low,j=mid+1,k=low;
    for (;i<=mid && j<=high;k++){
        if (elem[i].compareTo(elem[j])<=0)
            tmpElem[k]=elem[i++];
        else 
            tmpElem[k]=elem[j++];
    }
    for (;i<=mid;i++){
        tmpElem[k++]=elem[i];
    }
    for (;j<=high;j++){
        tmpElem[k++]=elem[j];
    }

    for (;low<=high;low++){
        elem[low]=tmpElem[low];
    }
}
private static <T extends Comparable<? super T>> void mergeHelp(T elem[],T tmpElem[],int low ,int high){
    if (low < high){
        int mid=(low+high)/2;
        mergeHelp(elem,tmpElem,low,mid);
        mergeHelp(elem,tmpElem,mid+1,high);
        simpleMerge(elem,tmpElem,low,mid,high);
    }
}
public static <T extends Comparable<? super T>> void mergeSort(T elem[],int n){
    T[] tmpElem=(T[])new Comparable[n];
    mergeHelp(elem,tmpElem,0,n-1);
}

}</pre>

 本文由用戶 ecfc 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!