Algorithm#快速排序

1.認識快排

(1)快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

(2)快排是冒泡的改進版,它有多種理解方法,比如挖坑填坑法,指針交換法和非遞歸實現,但總之,它的思想不變。

(3)快排的平均時間複雜度是nlogn,最差時是n2。在數據較少時,其實並不推薦用快排。

2.指針交換法

public class QuickSort {

    public static void main(String[] args) {
        int[]  a= {10,8,54,135,55,3,73,2,23,5,324,4,3,90};
        quicksort(a,0,a.length-1);
        System.out.println(Arrays.toString(a));
    }

    private static void quicksort(int[] a, int start, int end) {
        if(start>=end) {
            return;
        }
        int pivIndex=getPivoIndex(a,start,end);// step 1

       quicksort(a,start,pivIndex-1);
        quicksort(a,pivIndex+1,end);
    }

    private static int getPivoIndex(int[] a, int left, int right) {
        int k1=a[left];
        int i=left;
        int j=right;
        while(i<j) {
            while(i<j&&k1<=a[j]) {
                j--;
            }
            while(i<j&&a[i]<=k1) {
                i++;
            }
            if(i<j) {
                int temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }
        a[left]=a[i];//step 2
        a[i]=k1;
        return i;
    }
}
3.說明

       在寫該文章之前我有翻閱網上的很多其他人寫的,主要是爲了系統化的理解一下和回顧這些知識,但我發現有不少人可能並沒有運行他的代碼,在step2這個地方有錯誤,運行後並不是正確的結果。所以,如果想掌握,還是需要真正理解它的思想。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章