快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
之前提到过,Array的Sort()方法采用的是快速排序方法,通过使用.NET Reflector对程序集mscorlib进行解析,分析源码。
首先安装.NET Reflector,打开VS2010,新建一个项目,键入如下代码: string [] names = {"wang", "li", "liu", "zhao"}; Array.Sort(names); 在Sort上右键,选择“Open in .NET Reflector Desktop”,便会自动打开.NET Reflector: public static void Sort(T[] array) { if (array == null) { throw new ArgumentNullException("array"); } Sort(array, array.GetLowerBound(0), array.Length, null);}
点击 ArraySortHelper.Default.Sort(array, index, length, comparer):
internal class ArraySortHelper : IArraySortHelper { // Fields private static IArraySortHelper defaultArraySortHelper; // Methods public ArraySortHelper(); public int BinarySearch(T[] array, int index, int length, T value, IComparer comparer); [SecuritySafeCritical] private static IArraySortHelper CreateArraySortHelper(); internal static int InternalBinarySearch(T[] array, int index, int length, T value, IComparer comparer); internal static void QuickSort(T[] keys, int left, int right, IComparer comparer); public void Sort(T[] keys, int index, int length, IComparer comparer); private static void SwapIfGreaterWithItems(T[] keys, IComparer comparer, int a, int b); // Properties public static IArraySortHelper Default { get; } } 此时,可以看到快速排序,点击QuickSort,得到快速排序的源码: internal static void QuickSort(T[] keys, int left, int right, IComparer comparer) { do { int a = left; int b = right; int num3 = a + ((b - a) >> 1); ArraySortHelper.SwapIfGreaterWithItems(keys, comparer, a, num3); ArraySortHelper.SwapIfGreaterWithItems(keys, comparer, a, b); ArraySortHelper.SwapIfGreaterWithItems(keys, comparer, num3, b); T y = keys[num3]; do { while (comparer.Compare(keys[a], y) < 0) { a++; } while (comparer.Compare(y, keys[b]) < 0) { b--; } if (a > b) { break; } if (a < b) { T local2 = keys[a]; keys[a] = keys[b]; keys[b] = local2; } a++; b--; } while (a <= b); if ((b - left) <= (right - a)) { if (left < b) { ArraySortHelper.QuickSort(keys, left, b, comparer); } left = a; } else { if (a < right) { ArraySortHelper.QuickSort(keys, a, right, comparer); } right = b; } } while (left < right); } internal static void QuickSort(T[] keys, int left, int right, IComparer comparer) { do { int a = left; int b = right; int num3 = a + ((b - a) >> 1); ArraySortHelper.SwapIfGreaterWithItems(keys, comparer, a, num3); ArraySortHelper.SwapIfGreaterWithItems(keys, comparer, a, b); ArraySortHelper.SwapIfGreaterWithItems(keys, comparer, num3, b); T y = keys[num3]; do { while (comparer.Compare(keys[a], y) < 0) { a++; } while (comparer.Compare(y, keys[b]) < 0) { b--; } if (a > b) { break; } if (a < b) { T local2 = keys[a]; keys[a] = keys[b]; keys[b] = local2; } a++; b--; } while (a <= b); if ((b - left) <= (right - a)) { if (left < b) { ArraySortHelper.QuickSort(keys, left, b, comparer); } left = a; } else { if (a < right) { ArraySortHelper.QuickSort(keys, a, right, comparer); } right = b; } } while (left < right); }