快速排序一直都是记忆中的经典,对于那个pivot(枢轴)印象特深。在百度了一些资料后,很快的熟悉了快排的算法。以下分享代码可以直接在VS-控制台程序中运行。
参考到的资料有:
http://blog.csdn.net/wuxinyicomeon/article/details/5996675
http://www.dwz.cn/yiEnN
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace test
{
class Program
{
/*
理解快排,关键在于看懂一次排序单元的过程,其巧妙之处是对low和high的使用(其理解的精髓在于下面这句话:low和high指示的数组成员借助key的空间进行了赋值交换,
* 即low赋值给key,high--后找到目标赋值给low指示的位置,low++后把新找到的数又给high,最后把key放回++后的low的位置。
* 快排的时间复杂度为【最差】O(n^2)【平均】O(n*log2n) 【空间】复杂度为O(log2n)~O(n)
*/
static void Main(string[]args)
{
int[]array={49,38,65,97,76,13,27};
sort(array,0,array.Length-1);
Console.ReadLine();
}
/**一次排序单元,完成此方法,key左边都比key小,key右边都比key大。
**@paramarray排序数组
**@paramlow排序起始位置
**@paramhigh排序结束位置
**@return单元排序后的数组
*/
private static int sortUnit(int[]array,int low,int high)
{
int key=array[low];
while(low<high)
{
/*从后向前搜索比key小的值*/
while(array[high]>=key&&high>low)
--high;
/*比key小的放左边*/
array[low]=array[high];
/*从前向后搜索比key大的值,比key大的放右边*/
while(array[low]<=key&&high>low)
++low;
/*比key大的放右边*/
array[high]=array[low];
}
/*左边都比key小,右边都比key大。
//将key放在游标当前位置。
//此时low等于high
*/
array[low]=key;
Console.WriteLine(string.Join(",",array));
return high;
}
/**快速排序
*@paramarry
*@return
*/
public static void sort(int[]array,int low,int high)
{
if(low>=high)
return;
/*完成一次单元排序*/
int index=sortUnit(array,low,high);
/*对左边单元进行排序*/
sort(array,low,index-1);
/*对右边单元进行排序*/
sort(array,index+1,high);
}
}
}