首先我们应该了解快速排序是对冒泡排序的一种改进。
它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再对这两个部分分别进行快速排序,可以看出这是一个递归的过程。
快速排序的流程:
1、首先确定一个分界值,通过该分界值将数组分成左右两部分。(分界值一般选择排序部分的第一个元素)
2、将大于等于分界值的元素放在数组右边,小于分界值的元素放在数据左边。经过此操作后右边的元素都大于等于分界值,左边的元素都小于或等于分界值。
3、左边和右边的数据可以进行独立的快速排序。对于左侧的数据重复1、2步骤,对于右侧的数据重复1、2步骤。
4、重复上述过程,可以看出这是一个递归的过程。
下面给出一个实现方式,其中有详细的解释:
private void Sort(int[] array, int low, int high) {
if (low >= high) return;
Console.WriteLine("首先完成一次单元排序");
int index = SortUnit(array, low, high);
Console.WriteLine("对左边单元进行排序");
Sort(array, low, index - 1); //对左边单元进行排序
Console.WriteLine("对右边单元进行排序");
Sort(array, index + 1, high); //对右边单元进行排序
}
/// <summary>
/// 一次单元排序
/// </summary>
/// <param name="array">数组</param>
/// <param name="low">排序的起始位置</param>
/// <param name="high">排序的结束位置</param>
/// <returns>数组排序后的分界下标</returns>
private int SortUnit(int[] array,int low,int high)
{
//以第一个元素(即本次序列的第一个元素,本次序列指数组下标从low到high的所有元素的序列)作为分界值
int flagValue = array[low];
while (low<high)
{
while (array[high]>=flagValue && low<high) //(在本次序列中)从后向前搜索比分界值小的元素
{
high--;
}
array[low] = array[high]; //比分界值小的元素放在左边
while (array[low]<=flagValue &&low<high) //(在本次序列中)从前往后搜索比分界值大的元素
{
low++;
}
array[high] = array[low]; //比分界值大的元素放在右边
}
//经过上面的while循环此时low==high
//此时左边都比flagValue小,右边都比flagValue大
array[low] = flagValue;
Console.WriteLine("low={0},high={1},flagValue={2}", low, high, flagValue);
foreach (var item in array)
{
Console.Write("{0}\t",item);
}
Console.WriteLine();
return high;
}
public void QuickSortTest() {
int[] array = { 49, 38, 65, 97, 76, 13, 27 };
Console.WriteLine("排序前的数据:\t");
foreach (var item in array)
{
Console.Write("{0}\t", item);
}
Sort(array, 0, array.Length - 1);
Console.WriteLine("排序后的数据:\t");
foreach (var item in array)
{
Console.Write("{0}\t", item);
}
Console.ReadLine();
}
运行结果如下: