1. 三位取中法原理:
(1)取數組的首中尾位置的元素進行
(2)對首中尾三個位置的元素按照順序排序
(3)將排好順序地中位元素放到數組的倒數第二的位置
(4)下界指針從左側第二個開始找比基准元素大的,找到停止,再從倒數第三個數開始找比基准元素小的,找到停止,交換上界指針和下界指針指向的 值,繼續從左側開始比較,依次循環,直到指針相遇,判斷當前相遇值是否大於基准元素,若大於基准元素將,相遇時指針指向的值與倒數第二個值交換,此時數組被分成兩部分,左側全部比基准值小,右側全部比基准值大。
(5)對左側和右側兩部分分別各自執行(2),(3),(4)步驟,直到全部比較完成,完成排序。
2. 三位中值法圖表演示
3. C#代碼實現
class Program { static void Main(string[] args) { // 待排序數組 int[] sortArray = { 5, 8, 3, 2, 9, 1, 4, 7, 6 }; Stopwatch sw = new Stopwatch(); // 開始計時 sw.Start(); // 三位取中法 MiddleQuickSort(sortArray, 0, sortArray.Length - 1); // 計時結束 sw.Stop(); Console.WriteLine("快速排序方法耗時(毫秒)=" + sw.ElapsedMilliseconds); } private static void MiddleQuickSort(int[] sortArray, int low, int high) { if (low < high) { // 將基准元素放到序列末尾,取基准元素位置 PivotGet(sortArray, low, high); int pivot = high - 1; int i = low, j = high - 1; while (true) { while (sortArray[++i] < sortArray[pivot]) { // 下界指針移動,若下界指針指向的元素小於基准元素,什么也不做,一直找,直到找到比基准元素大的 } while (j > low && sortArray[--j] > sortArray[pivot]) { // 上界指針沒有與下界指針相遇,找上界指針指向的值大於下界指針指向的值,一直找直至找到 } if (i < j) { Change(sortArray, i, j); } else { break; } } if (i < high) { Change(sortArray, i, high - 1); } SortShow(sortArray); // 對低子表遞歸排序 MiddleQuickSort(sortArray, low, i - 1); // 對高子表遞歸排序 MiddleQuickSort(sortArray, i + 1, high); } } /// <summary> /// 將左中右三個值排成有序且把基准元素排到倒數第二的位置 /// </summary> /// <param name="sortArray">待排序數組</param> /// <param name="low">下界指針</param> /// <param name="high">上界指針</param> private static void PivotGet(int[] sortArray, int low, int high) { int middle = (low + high) / 2; // 首尾比較,若首元素比尾元素大則交換 if (sortArray[low] > sortArray[high]) { Change(sortArray, low, high); } // 首中比較,若首元素比中間元素大則交換 if (sortArray[low] > sortArray[middle]) { Change(sortArray, low, middle); } // 中尾比較,若中間元素比尾元素大則交換 if (sortArray[middle] > sortArray[high]) { Change(sortArray, high, middle); } // 將中間元素與倒數第二元素交換,將中間元素排到倒數第二的位置 Change(sortArray, high - 1, middle); } /// <summary> /// 交換兩個值 /// </summary> /// <param name="sortArray">待排序數組</param> /// <param name="low">下界指針</param> /// <param name="high">上界指針</param> private static void Change(int[] sortArray, int a, int b) { int temp = sortArray[a]; sortArray[a] = sortArray[b]; sortArray[b] = temp; } private static void SortShow(int[] sortArray) { for (int i = 0; i < sortArray.Length; i++) { Console.Write(sortArray[i] + " "); } Console.WriteLine(); } }