快速排序(Quicksort)是對冒泡排序的一種改進。
快速排序的基本概念是:
通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,
然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
下面通過一個例子來了解快速排序的具體含義:
{ 23, 45, 60, 10, 17, 101,12}
第一遍排序:
由此思想,我們可以實現快速排序的代碼:
注意基准數據永遠不變,永遠是和基准數據進行比較,無論在什么位置,最后的目的就是把基准數據放在中間,小的放前面大的放后面。
namespace QuickSort { class QuickSort { private int Func(int[] n, int left, int right) { int baseNum = n[left]; // 基准數據 int i = left; int j = right; while (true) { if (n[i] < baseNum && i < j) { i++; } else if (n[i] > baseNum && i < j) { int number = n[i]; n[i] = n[j]; n[j] = number; j--; } else if (n[j] < baseNum && i < j) { int number = n[i]; n[i] = n[j]; n[j] = number; i++; } else if (n[j] > baseNum && i < j) { j--; } else if (i == j) { n[i] = baseNum; break; } } return i; } public void QuickSortFunc(int[] n, int left, int right) { //左下標一定小於右下標,否則就超越了 if (left < right) { //對數組進行分割,取出下次分割的基准標號 int i = Func(n, left, right); //對“基准標號“左側的一組數值進行遞歸的切割,以至於將這些數值完整的排序 QuickSortFunc(n, left, i - 1); //對“基准標號“右側的一組數值進行遞歸的切割,以至於將這些數值完整的排序 QuickSortFunc(n, i + 1, right); } } static void Main(string[] args) { int[] n = { 23, 45, 60, 10, 17, 101,12}; QuickSort qs = new QuickSort(); qs.QuickSortFunc(n, 0, n.Length - 1); for (int i = 0; i < n.Length; i++) { Console.WriteLine(n[i]); } Console.ReadLine(); } } }
其實我們還可以取中間的數作為基准,具體示例如下:
private void Sort(int[] numbers, int left, int right) { //左邊索引小於右邊,則還未排序完成 if (left < right) { //取中間的元素作為比較基准,小於他的往左邊移,大於他的往右邊移 int middle = numbers[(left + right) / 2]; int i = left - 1; int j = right + 1; while (true) { while (numbers[++i] < middle && i < right) ; while (numbers[--j] > middle && j > 0) ; if (i >= j) break; Swap(numbers, i, j); } Sort(numbers, left, i - 1); Sort(numbers, j + 1, right); for (int k = 0; k < numbers.Length; k++) { Console.WriteLine(numbers[k]); } Console.ReadLine(); } } private void Swap(int[] numbers, int i, int j) { int number = numbers[i]; numbers[i] = numbers[j]; numbers[j] = number; }