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