背景介紹: 又稱(chēng)劃分交換排序(partition-exchange sort),一種排序算法,最早由東尼·霍爾提出。在平均狀況下,排序n個(gè)項(xiàng)目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況并不常見(jiàn)。事實(shí)上,快速排序通常明顯比其他Ο(n log n)算法更快,因?yàn)樗膬?nèi)部循環(huán)(inner loop)可以在大部分的架構(gòu)上很有效率地被實(shí)現(xiàn)出來(lái) ----- 來(lái)自 wikipedia **
算法規(guī)則: 本質(zhì)來(lái)說(shuō),快速排序的過(guò)程就是不斷地將無(wú)序元素集遞歸分割,一直到所有的分區(qū)只包含一個(gè)元素為止。
由于快速排序是一種分治算法,我們可以用分治思想將快排分為三個(gè)步驟:
1.分:設(shè)定一個(gè)分割值,并根據(jù)它將數(shù)據(jù)分為兩部分
2.治:分別在兩部分用遞歸的方式,繼續(xù)使用快速排序法
3.合:對(duì)分割的部分排序直到完成
代碼實(shí)現(xiàn)(Java版本)
public int dividerAndChange(int[] args, int start, int end)
{
//標(biāo)準(zhǔn)值
int pivot = args[start];
while (start < end) {
// 從右向左尋找,一直找到比參照值還小的數(shù)值,進(jìn)行替換
// 這里要注意,循環(huán)條件必須是 當(dāng)后面的數(shù) 小于 參照值的時(shí)候
// 我們才跳出這一層循環(huán)
while (start < end && args[end] >= pivot)
end--;
if (start < end) {
swap(args, start, end);
start++;
}
// 從左向右尋找,一直找到比參照值還大的數(shù)組,進(jìn)行替換
while (start < end && args[start] < pivot)
start++;
if (start < end) {
swap(args, end, start);
end--;
}
}
args[start] = pivot;
return start;
}
public void sort(int[] args, int start, int end)
{
//當(dāng)分治的元素大于1個(gè)的時(shí)候,才有意義
if ( end - start > 1) {
int mid = 0;
mid = dividerAndChange(args, start, end);
// 對(duì)左部分排序
sort(args, start, mid);
// 對(duì)右部分排序
sort(args, mid + 1, end);
}
}
private void swap(int[] args, int fromIndex, int toIndex)
{
args[fromIndex] = args[toIndex];
}