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這個地方有錯誤,運行後並不是正確的結果。所以,如果想掌握,還是需要真正理解它的思想。