java實現冒泡排序,選擇排序,插入排序,快速排序(簡潔版)及性能測試

jopen 10年前發布 | 26K 次閱讀 java排序 Java開發

1、冒泡排序是排序里面最簡單的了,但性能也最差,數量小的時候還可以,數量一多,是非常慢的。

它的時間復雜度是O(n*n),空間復雜度是O(1)

代碼如下,很好理解。

public void bubbleSort(int[] arr){
        for(int i=0;i<arr.length-1;i++){
            for(int j=arr.length-1;j>i;j--){
                if(arr[j-1]>arr[j]){
                    int temp=arr[j-1];
                    arr[j-1]=arr[j];
                    arr[j]=temp;
                }
            }
        }

    }

2、選擇排序

選擇排序的時間復雜度還有空間復雜度跟冒泡是一樣的。

public void chooseSort(int[] arr){
        for(int i=0;i<arr.length;i++){
            for(int j=i+1;j<arr.length;j++){
                if(arr[i]>arr[j]){
                    int temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
    }


3、插入排序

插入排序的時間復雜度也是O(n*n),空間復雜度也是O(1)。

public void insertSort(int[] arr){
        for(int j=1;j<arr.length;j++){
            for(int i=0;i<j;i++){
                if(arr[i]>arr[j]){
                    int tmp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=tmp;
                    break;
                }
            }
        }
    }

4、快速排序

快速排序通常情況下是最快的,名不虛傳啊~平均時間復雜度是 O(Nlog2N),最差也是O(N*N),空間復雜度O(Nlog2N) 

public void quickSort(int[] arr,int head,int tail){
        int i=head;
        int j=tail;
        if(i > j){
            return;
        }
        int key=arr[i];
        while(i<j){
            while(i<j && key<=arr[j]){
                j--;
            }
            if(i<j){
                arr[i++]=arr[j];
            }
            while(i<j && key>=arr[i]){
                i++;
            }
            if(i<j){
                arr[j--]=arr[i];
            }
        }
        arr[j]=key;
        quickSort(arr,head,j-1);
        quickSort(arr,j+1,tail);

    }
下面就是性能測試了~

分別為這4個算法生成4個長度為6000的隨機數組,然后測排序時間。

代碼如下

public static void main(String[] args) throws Exception{

    int[] arr1=new int[6000];
    for(int i=0;i<arr1.length;i++){
        arr1[i]=new Random().nextInt(6000)+1;
    }
    int[] arr2=new int[6000];
    for(int i=0;i<arr2.length;i++){
        arr2[i]=new Random().nextInt(6000)+1;
    }
    int[] arr3=new int[6000];
    for(int i=0;i<arr3.length;i++){
        arr3[i]=new Random().nextInt(6000)+1;
    }
    int[] arr4=new int[6000];
    for(int i=0;i<arr4.length;i++){
        arr4[i]=new Random().nextInt(6000)+1;
    }
    Test t=new Test();
    long m=System.currentTimeMillis();
    t.bubbleSort(arr1);
    long n=System.currentTimeMillis();
    System.out.println("冒泡排序耗時:"+(n-m)+"ms");
    long p=System.currentTimeMillis();
    t.chooseSort(arr2);
    long q=System.currentTimeMillis();
    System.out.println("選擇排序耗時:"+(q-p)+"ms");
    long e=System.currentTimeMillis();
    t.insertSort(arr4);
    long d=System.currentTimeMillis();
    System.out.println("插入排序耗時:"+(d-e)+"ms");
    long a=System.currentTimeMillis();
    t.quickSort(arr3, 0, arr3.length-1);
    long b=System.currentTimeMillis();
    System.out.println("快速排序耗時:"+(b-a)+"ms");
}
}

結果如下:

冒泡排序耗時:182ms

選擇排序耗時:120ms

插入排序耗時:4ms

快速排序耗時:1ms

見識到快速排序的威力了吧~不過他也是付出了內存空間的代價,如果數據量過大,會出現著名的StackOverFlow棧溢出異常哦~


來自:http://blog.csdn.net/exceptional_derek/article/details/11786913

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