案例:
假如待排序列如下:
6
為基準(zhǔn)數(shù),然后先從右邊開(kāi)始遍歷,找到一個(gè)比基準(zhǔn)數(shù)小的數(shù),如下圖:5
和7
的位置,結(jié)果如下:7
的位置開(kāi)始,找到比基準(zhǔn)數(shù)小的數(shù),如下:5
開(kāi)始找,結(jié)果如下:9
和4
的位置,結(jié)果如下:3
,然后從左邊找比基準(zhǔn)數(shù)大的,左邊指針移動(dòng)到3的時(shí)候,左右指針重合了,如下:6
和3
的位置,如圖:6
左邊的都是比它小的,右邊的都是比它大的。左邊部分和右邊部分看成是兩個(gè)新的待排序列,兩個(gè)序列都按照上述方式再進(jìn)行排序,先排左邊,再排右邊。結(jié)合上面的案例,以及代碼中的注釋?zhuān)梢哉f(shuō)是思路十分清晰了,完整代碼如下:
public static void sort(int[] arr, int left, int right) {
if (arr == null || arr.length == 1) {
return;
}
if (left > right) {
return;
}
int base = arr[left]; // 最左邊的數(shù)當(dāng)作基準(zhǔn)數(shù)
int i = left; // 從左往右遍歷的指針
int j = right; // 從右往左遍歷的指針
int temp = 0; // 用來(lái)保存臨時(shí)變量
// 當(dāng)左右指針不相遇的時(shí)候,就進(jìn)行檢索
while(i != j) {
// 先從右往左檢索,直到檢索到比基準(zhǔn)數(shù)小的
while (arr[j] >= base && i < j) {
j--;
}
// 再?gòu)淖笸覚z索,直到檢索到比基準(zhǔn)數(shù)大的
while (arr[i] <= base && i < j) {
i++;
}
// 跳出了上面兩個(gè)while循環(huán),表示右邊找到了基準(zhǔn)數(shù)小的,左邊找到了比基準(zhǔn)數(shù)大的,交換位置
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// 跳出了最外層while循環(huán),表示i和j相等,左右指針相遇了,交換基準(zhǔn)數(shù)和此時(shí)指針指的元素
arr[left] = arr[i];
arr[i] = base;
// 此時(shí),第一趟排序完成,左邊和右邊看成新數(shù)組,重復(fù)上述步驟
sort(arr, j+1, right); // 排右邊
sort(arr, left, i-1); // 排左邊
}
快速排序之所以成為快速排序,那就是因?yàn)樗欤?jīng)測(cè)試,排1千萬(wàn)數(shù)據(jù)大概是1秒的樣子,還真是有兩把刷子。
聯(lián)系客服