快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。--摘自百度百科
算法的原理用文字叙述不是特别容易理解,有一个出名的视频用真人舞蹈演绎了快速排序算法的全过程,通俗易懂。http://v.youku.com/v_show/id_XMzMyODk4NTQ4.html
递归的主题算法很简单:
/// <summary>
/// Quick Sort
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
public static void QuickSort<T>(T[] array, int left, int right) where T : IComparable
{
if (left < right)
{
int middle = GetMiddleForQuickSort<T>(array, left, right);
QuickSort<T>(array, left, middle - 1);
QuickSort<T>(array, middle + 1, right);
}
}
最关键的是如何实现GetMiddleForQuickSort
/// <summary>
/// get the index of the middle value for qucik sort
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
/// <param name="left"></param>
/// <param name="right"></param>
/// <returns></returns>
private static int GetMiddleForQuickSort<T>(T[] array, int left, int right) where T : IComparable
{
T key = array[left];
while (left < right)
{
while (left < right && key.CompareTo(array[right]) < 0)
{
right--;
}
if (left < right)
{
T temp = array[left];
array[left] = array[right];
Console.WriteLine("array[{0}]:{1} ----> arry[{2}]:{3}", left, temp, right, array[right]);
left++;
}
while (left < right && key.CompareTo(array[left]) > 0)
{
left++;
}
if (left < right)
{
T temp = array[right];
array[right] = array[left];
Console.WriteLine("array[{0}]:{1} ----> arry[{2}]:{3}", right, temp, left, array[left]);
right--;
}
array[left] = key;
}
Console.WriteLine("find the middle value {0} and the index {1}", array[left], left);
return left;
}
测试
static void Main(string[] args)
{
int[] array = new int[] { 77, 22, 9, 22, 32, 11 };
Console.WriteLine("before quick sort");
foreach (int i in array)
{
Console.Write(i + "->");
}
Console.WriteLine();
SortHelper.QuickSort<int>(array, 0, array.Length - 1);
Console.WriteLine("after quick sort");
foreach (int i in array)
{
Console.Write(i + "->");
}
Console.WriteLine();
Console.ReadKey();
}
输出:
before quick sort
77->22->9->22->32->11->
array[0]:77 ----> arry[5]:11
find the middle value 77 and the index 5
array[0]:11 ----> arry[2]:9
array[2]:9 ----> arry[1]:22
find the middle value 11 and the index 1
array[2]:22 ----> arry[3]:22
find the middle value 22 and the index 3
after quick sort
9->11->22->22->32->77->