快速(二分法)排序的思想是將數組劃分為兩邊,以某個節點v為界(設這個節點的值為 v),在節點v左邊的所有元素都小於 v, 在節點v右邊的所有元素都大於v.
這樣不停地劃分,到最後整個數組就是有序的了。
具體分成兩邊的思路為(起始下標為start, 結束下標為 end):
選擇v = a[end]作為中介點
先從start開始掃描,遇到a[++i] < v停下來,接著從end開始掃描a[--j] > v停下來,交換a[i]和a[j]
接著從i+1開始掃描,另一邊接著從j-1開始掃描。注意邊界條件if (i >= j) break; 掃描完成後就找到了v應該放得位置,交換Swap(ref a[i], ref a[end]);這樣就完成了一次劃分。
該演算法的平均時間複雜度為nLgn,最壞的情況是n的平方。該演算法適合使用於大資料量的排序:
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace QuickSort{ class Program { static void Main(string[] args) { int[] a ={1,6,4,3,8,5,21,9,31,81,101,55,62, 151, 7,2,10}; quicksort(a, 0, a.Length-1); for (int i = 0; i < a.Length; i++) { Console.WriteLine(a[i]); } Console.Read(); } static void quicksort(int[] a, int start, int end) { int i; if (end - start == 1) { if (a[start] > a[end]) { Swap(ref a[start], ref a[end]); } return; } if (end - start == 0) { return; } i = partition(a, start, end); if (i > start) { quicksort(a, start, i - 1); } if (i < end) { quicksort(a, i + 1, end); } } static int partition(int[] a, int start, int end) { int i = start-1; int j = end; int v = a[end]; for (; ; ) { while (i < end && a[++i] < v) ; while (j > start && a[--j] > v) ; if (i > = j) break; Swap(ref a[i], ref a[j]); } Swap(ref a[i], ref a[end]); return i; } static void Swap(ref int a, ref int b) { int temp = a; a = b; b = temp; } }}