快速排序應該是目前最快,也是最常用的一種排序演算法。它將乙個集合劃分成兩個子集合,然後繼續遞迴來完成最終排序。
具體做法:
1. 選取集合最右端的元素作為乙個參照物,稱之為 "樞紐" (pivot)。
2. 開始計算分割位置。在計算時,進行元素交換,確保左側元素都小於樞紐,而右側都大於樞紐。
3. 根據分割位置,分別遞迴左右兩段子集合,直至最終完成排序。
過程演示:
array = ;
第一輪呼叫:
1. 首先獲取最右側元素 0 作為樞紐。
2. 由於沒有比樞紐更小的元素,因此沒有發生內部交換。
3. 將樞紐和第乙個元素進行交換,確保 "左側" 都小於樞紐,"右側" 都大於樞紐。陣列變成 。
4. 返回分割位置: 0
第二次呼叫:
1. 右段子集合變成: ;
2. 獲取樞紐 2。
3. 左右遞推,我們找到右端第乙個小於樞紐的值 1,將其和左側第乙個大於樞紐的 9 進行交換,陣列變成 。
4. 交換樞紐位置,陣列變成 。
...我想你已經明白了快速排序的原理,接下來給出具體的實現**。
static void quicksort(int array, int left, int right)
static int partitionit(int array, int left, int right, int pivot)
; // 逆向迴圈,直到第乙個小於樞紐的元素位置(最後一位是樞紐,因此從 --rightptr 開始)。
while (rightptr > 0 && array[--rightptr] > pivot) ;
// 越界,跳出迴圈。
if (leftptr >= rightptr) break;
// 交換左右查詢到的元素,將小於樞紐的值交換到左側,大於樞紐的值交換到右側。
swap(array, leftptr, rightptr);
// 繼續迴圈,找下乙個大於或小於樞紐的元素進行交換。
}// 將最右端的樞紐交換到合適位置
swap(array, leftptr, right);
// 返回分界位置
return leftptr;
}static void swap(int array, int a, int b)
static void main(string args)
;quicksort(array, 0, array.length - 1);
var s = string.join(",", array.convertall(array, i => i.tostring()));
console.writeline(s);
}最後是老規矩,和其他排序演算法比較一下效能。
class program
static void recquicksort(int array, int left, int right)
static int partitionit(int array, int left, int right, int pivot)
;while (rightptr > 0 && array[--rightptr] > pivot) ;
if (leftptr >= rightptr) break;
swap(array, leftptr, rightptr);
}swap(array, leftptr, right);
return leftptr;
}static void swap(int array, int a, int b)
static void shellsort(int array)
while (h > 0)
array[inner] = temp;
}h = (h - 1) / 3;}}
static void main(string args)
-------------", length);
int array = new int[length];
var ran = new random();
for (int i = 0; i < array.length; i++)
action> sort = (arr, func) =>
: ",
func != null ? func.method.name : "array.sort",
watch.elapsedmilliseconds);
};var a1 = array.clone() as int;
var a2 = array.clone() as int;
var a3 = array.clone() as int;
sort(a1, quicksort);
sort(a2, shellsort);
sort(a3, null);}}
}輸出:
-10000-------------
quicksort: 1
shellsort: 2
array.sort: 1
-20000-------------
quicksort: 3
shellsort: 4
array.sort: 2
-30000-------------
quicksort: 4
shellsort: 7
array.sort: 4
-40000-------------
quicksort: 6
shellsort: 11
array.sort: 5
-50000-------------
quicksort: 8
shellsort: 13
array.sort: 7
你發現了什麼?除了比希爾排序強以外,快速排序似乎和 array.sort 有某種關聯。趕緊去看看……
[reliabilitycontract(consistency.maycorruptinstance, cer.mayfail)]
public static void sort(array array)
[reliabilitycontract(consistency.maycorruptinstance, cer.mayfail)]
public static void sort(array keys, array items, int index, int length, icomparer comparer)
if ((objarray != null) && ((items == null) || (objarray2 != null)))
else}}
原來 array.sort() 方法內部使用的就是快速排序演算法。
排序 快速排序(C )
1 演算法描述 1.1 設當前參加排序的陣列為array 0.n 1 選擇乙個元素 通常稱該元素為基準元素 作為基準元素 將小於或者等於基準元素的所有元素都移到基準元素的左邊 把大於或者等於基準元素的所有元素都移到分界元素的右邊 執行完 2 3 步驟後,基準元素左邊元素序列,基準元素,基準元素右邊元...
排序 快速排序(C )
如果看不懂這些乾巴巴的理 字,那就先不用看了,下面 中有詳細的注釋,大家可以先跟著 走幾遍,回過頭來再看這些文字描述,總之 紙上得來終覺淺,絕知此事要躬行。排序演算法哪家強,從實際應用的角度上將,快排表現很好。很自然地,人們會覺得短陣列比長陣列更好處理,因此可能會想到將原始陣列分為若干各子部分然後分...
快速排序C
1.快速排序 include void run int pdata,int left,int right while i j 如果兩邊掃瞄的下標交錯,就停止 完成一次 當左邊部分有值 lefti 遞迴右半邊 if right i run pdata,i,right void quicksort in...