public static void kuaisu(int arr,int low,int high)
if(j>i)
while(j>i && arr[i]i)
arr[i]=x;
kuaisu(arr,i+1,high);
kuaisu(arr,low,i-1);}
}public static void main(string args) ;
int arr3=;
int arr2=;
kuaisu(arr3, 0, arr3.length-1);
for(int s:arr3)
}
快速排序的基本思想是
1、先從數列中取出乙個數作為基準數概括來說為挖坑填數+分治法2、分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊
3、再對左右區間重複第二步,直到各區間只有乙個數
下面舉例來進行說明,主要有三個引數,i為區間的開始位址,j為區間的結束位址,x為當前的開始的值
第一步,i=0,j=9,x=2101
2345
6789
2132
4398
5445234
6686
第二步,從j開始由,後向前找,找到比x小的第乙個數a[7]=4,此時i=0,j=6,x=21
進行替換01
2345
6789
4324398
5445
232166
86第三步,由前往後找,找到比x大的第乙個數a[1]=32,此時i=2,j=6,x=2101
2345
6789
42143
9854
4523
3266
86第四步,從j=6開始由,由後向前找,找到比x小的第乙個數a[0]=4,此時i=2,j=0,x=21,發現j<=i,所以第一回結束
可以發現21前面的數字都比21小,後面的數字都比21大
接下來對兩個子區間[0,0]和[2,9]重複上面的操作即可
下面直接給出過程,就步詳細解說了
i=2,j=6,x=4301
2345
6789
4214398
5445
233266
86i=4,j=6,x=4301
2345
6789
421329854
4523
4366
86i=4,j=5,x=4301
2345
6789
421324354
452398
6686
i=5,j=5,x=4301
2345
6789
4213223
4345
5498
6686
然後被分為了兩個子區間[2,3]和[5,9]
….最後排序下去就是最終的答案01
2345
6789
4212332
4345
5466
8698
總結:
1.i =l; j = r; 將基準數挖出形成第乙個坑a[i]。快速排序:平均時間複雜度log2(n)*n,所有內部排序方法中最高好的,大多數情況下總是最好的。2.j–由後向前找比它小的數,找到後挖出此數填前乙個坑a[i]中。
3.i++由前向後找比它大的數,找到後也挖出此數填到前乙個坑a[j]中。
4.再重複執行2,3二步,直到i==j,將基準數填入a[i]中。
快速排序是不穩定的。
穩定性簡單來說就是:
如果a i == a j,ai 原來在 aj 位置前,排序後 ai 仍然是在 aj 位置前,這樣就是穩定的。
八大排序之快速排序
快速排序 public class quicksort int arr 測試時間複雜度 o n 2 int arr new int 80000 for int i 0 i arr.length i long start time system.currenttimemillis quicksort ...
八大排序之快速排序
思想 定義陣列中的第乙個數為標誌量,再定義兩個指標,乙個指標從右向左開始遍歷陣列,直到找到乙個數比標誌量小 另乙個指標再從左向右遍歷陣列,直到找到乙個數比標誌量大。若找到,則交換這兩個數的位置,然後重複上述過程。直到兩個指標相遇時,交換此時指標指向的數的位置與標誌量的位置。此時,標誌量左邊的數均小於...
八大排序演算法1 快速排序
1.原理介紹 假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。首先在這個序列中隨便找乙個數作為基準數,為了方便,就讓第乙個數6作為基準數吧。接下來,需要將這個序列中所有比基準數大的數放在6的右邊,比基準數小的數放在6的左邊,類似下面這種排列 3 1 2 5 4 6 9...