快速排序法是一种常用的排序方法,有关快速排序的介绍请看博客 快速排序。
有关快速排序法,还有几点可以优化的。
第一:在找基准数据时,从索引firstIndex中间位置mIndex和最后的位置lastIndex中找出最合适的。那么什么样的位置最合适呢?比如数组int[] {4,5,6,1,2},在第一次快速排序时如果只是简单的取4,6,2进行排序,那么6就被作为基准数据,显然数组中的数据就会进行多次的Swap交换。如果把4,6,2的位置进行调整是否会更合适呢?答案是肯定的,调整之后的数组为{2,5,4,1,6}。把4作为基准数据更加合适。恰好SwapIfGreaterWithItems方法就是交换数组元素的。
第二:计算中间索引值。计算中间索引,一般会用数组的长度/2,在此使用数组长度向右移动一位,简单快捷。
通过以上两个优化,快速排序就更合理了。
代码如下:
private static void QuickSort(int left, int right) { do { int low = left; int hi = right; int median = GetMedian(low, hi); try { SwapIfGreaterWithItems(low, median); SwapIfGreaterWithItems(low, hi); SwapIfGreaterWithItems(median, hi); } catch (Exception exception2) { throw new Exception(exception2.Message); } object y = items[median]; do { while (comparer.Compare(items[low], y) < 0) { low++; } while (comparer.Compare(y, items[hi]) < 0) { hi--; } if (low > hi) { break; } if (low < hi) { object obj3 = items[low]; items[low] = items[hi]; items[hi] = obj3; } low++; hi--; } while (low <= hi); if ((hi - left) <= (right - low)) { if (left < hi) { QuickSort(left, hi); } left = low; } else { if (low < right) { QuickSort(low, right); } right = hi; } } while (left < right); }
取两个数中间值(在此是取索引)函数代码:
private static int GetMedian(int low, int hi) { return (low + ((hi - low) >> 1)); }
两个数据元素交换方法代码:
private static void SwapIfGreaterWithItems(int a, int b) { if ((a != b) && (comparer.Compare(items[a], items[b]) > 0)) { object obj2 = items[a]; items[a] = items[b]; items[b] = obj2; } }