快排定義:
設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用數組的第一個數)作為關鍵數據,然后將所有比它小的數都放到它前面,所有比它大的數都放到它后面,這個過程稱為一趟快速排序。
基本思想:
快速排序采用的思想是分治思想。
快速排序是找出一個元素(理論上可以隨便找一個)作為基準(pivot),然后對數組進行分區操作,使基準左邊元素的值都不大于基準值,基準右邊的元素值 都不小于基準值,如此作為基準的元素調整到排序后的正確位置。遞歸快速排序,將其他n-1個元素也調整到排序后的正確位置。最后每個元素都是在排序后的正 確位置,排序完成。所以快速排序算法的核心算法是分區操作,即如何調整基準的位置以及調整返回基準的最終位置以便分治遞歸。
舉例說明一下吧,這個可能不是太好理解。假設要排序的序列為
22 4 9 3 6 7 15首先用2當作基準,使用i,j兩個指針分別從兩邊進行掃描,把比2小的元素和比2大的元素分開。首先比較2和5,5比2大,j左移
22 4 9 3 6 715 比較2和1,1小于2,所以把1放在2的位置
2149 3 6 7 1 5 比較2和4,4大于2,因此將4移動到后面
2149 3 674 5 比較2和7,2和6,2和3,2和9,全部大于2,滿足條件,因此不變
經過第一輪的快速排序,元素變為下面的樣子
[1] 2 [4 9 3 6 7 5]
之后,在把2左邊的元素進行快排,由于只有一個元素,因此快排結束。右邊進行快排,遞歸進行,最終生成最后的結果。
class PRogram{ static void Main(string[] args) { int[] array = new[] { 234, 632, 23, 643, 2, 6, -2, 423, 2342, 43 }; Console.WriteLine("排序前:"); Console.WriteLine(string.Join(",", array)); QuickSort(array, 0, array.Length - 1); Console.WriteLine("排序后:"); Console.WriteLine(string.Join(",", array)); Console.ReadKey(); } /// <summary> /// 快速排序 /// </summary> /// <param name="sources">目標數組</param> /// <param name="left">數組最小索引</param> /// <param name="right">數組最大索引</param> private static void QuickSort(int[] sources, int left, int right) { // 終止遞歸,排序完畢 if (left > right) return; int pivot = sources[left], //基準數 low = left, high = right; while (low < high) { // 從右往左遞減判斷 while (low < high && sources[high] > pivot) --high; // 小于基準數的放在左邊 sources[low] = sources[high]; // 從左往右遞增判斷 while (low < high && sources[low] < pivot) ++low; // 大于基準數的放在右邊 sources[high] = sources[low]; } // 一遍排序后,左邊都小于基準數,右邊都大于基準數 sources[low] = pivot; // 分區遞歸 QuickSort(sources, left, low - 1); QuickSort(sources, low + 1, right); }}
新聞熱點
疑難解答