Java 疾速排序(QuickSort)道理及完成代碼。本站提示廣大學習愛好者:(Java 疾速排序(QuickSort)道理及完成代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是Java 疾速排序(QuickSort)道理及完成代碼正文
疾速排序(QuickSort )是經常使用到的效力比擬高的一種排序算法,在面試進程中也常常說起。上面就具體講授一下他的道理、給出一個Java版本的完成。
疾速排序思惟:
經由過程對數據元素聚集Rn 停止一趟排序劃分出自力的兩個部門。個中一個部門的症結字比另外一部門的症結字小。然後再分離對兩個部門的症結字停止一趟排序,直到自力的元素只要一個,此時全部元素聚集有序。
疾速排序的進程——挖坑填數法(這是一個很抽象的稱號),對一個元素聚集R[ low ... high ] ,起首取一個數(普通是R[low] )做參照 , 以R[low]為基准從新分列一切的元素。
一切比R[low]小的放後面,一切比R[low] 年夜的放前面,然後以R[low]為分界,對R[low ... high] 劃分為兩個子集和,再做劃分。直到low >= high 。
好比:對R={37, 40, 38, 42, 461, 5, 7, 9, 12}停止一趟疾速排序的進程以下(注:上面描寫的內容中元素下表從 0 開端):
原始序列
37
40
38
42
461
5
7
9
12
一:high-->low
12
40
38
42
461
5
7
9
12
一:low --> high
12
40
38
42
461
5
7
9
40
二:high-->low
12
9
38
42
461
5
7
9
40
二:low --> high
12
9
38
42
461
5
7
38
40
三:high --> low
12
9
7
42
461
5
7
38
40
三:low -->high
12
9
7
42
461
5
42
38
40
四:high --> low
12
9
7
5
461
5
42
38
40
四:low --> high
12
9
7
5
461
461
42
38
40
一趟排序成果
12
9
7
5
37
461
42
38
40
開端拔取基准 base = 37,初始地位下表 low = 0 , high = 8 , 從high=8,開端假如R[8] < base , 將high地位中的內容寫入到R[low]中, 將high地位空出來, low = low +1 ;
從low開端探測,因為low=1 , R[low] > base ,所以將R[low]寫入到R[high] , high = high -1 ;
檢測到low < high ,所以第一趟疾速排序仍需持續:
此時low=1,high=7,由於 R[high] < base ,所以將 R[high] 寫入到到R[low]中,low = low + 1;
從low開端探測,low = 2 , R[low] >base ,所以講R[low]寫入到R[high],high=high-1;
持續檢測到 low 小於high
此時low=2,high=6,同理R[high] < base ,將R[high] 寫入到R[low]中,low=low+1;
從low持續探測,low = 3 , high=6 , R[low] > base , 將R[low]寫入到R[high]中,high = high-1;
持續探測到low小於high
此時low=3,high=5,同理R[high] < base,將R[high]寫入到R[low]中,low = low +1;
從low持續探測,low = 4,high=5,因為R[low] > base , 將R[low]寫入到R[high]中,high = high -1 ;
此時探測到low == high == 4 ;該地位等於base地點的地位,將base寫入到該地位中.
然後再對子序列Rs1 = {12,9,7,5} 和 Rs2={461,42,38,40}做一趟疾速排序,直到Rsi中只要一個元素,或沒有元素。
(注: 在以上表單中可以看到一趟排序中有一些反復的數據(原始數據中沒有反復的數據),這是由於沒有消除該地位的數據,我們在特定的時光看該內存塊的數據仍然是它,直到下一次將數據寫入該地位地位 —— 在此該地位的數據是一個沒成心義髒數據,稱之為 “坑”)
疾速排序的Java完成:
private static boolean isEmpty(int[] n) {
return n == null || n.length == 0;
}
// ///////////////////////////////////////////////////
/**
* 疾速排序算法思惟——挖坑填數辦法:
*
* @param n 待排序的數組
*/
public static void quickSort(int[] n) {
if (isEmpty(n))
return;
quickSort(n, 0, n.length - 1);
}
public static void quickSort(int[] n, int l, int h) {
if (isEmpty(n))
return;
if (l < h) {
int pivot = partion(n, l, h);
quickSort(n, l, pivot - 1);
quickSort(n, pivot + 1, h);
}
}
private static int partion(int[] n, int start, int end) {
int tmp = n[start];
while (start < end) {
while (n[end] >= tmp && start < end)
end--;
if (start < end) {
n[start++] = n[end];
}
while (n[start] < tmp && start < end)
start++;
if (start < end) {
n[end--] = n[start];
}
}
n[start] = tmp;
return start;
}
在代碼中有如許一個函數:
public static void quickSortSwap(int[] n, int l, int h)
該函數可以完成,元素聚集中特定的 l 到 h 地位間的數據元素停止排序。
關於疾速排序就寫到這裡了。