快速排序
代码
public static void QuickSort(int[] data,int low,int high)
{
int i=low;
int j=high;
int tmp=data[low];
while(low<hight)
{
while((low<high) && (data[high]>=tmp))
{
--high;
}
data[low]=data[high];
++low;
while((low<high) &&(data[low]<=tmp))
{
++low;
}
data[high]==data[low];
--high;
}
data[low]=tmp;
if(i<low-1)
{
QuickSort(data,i,low-1);
}
if(j>low+1)
{
QuickSort(data,low+1,j);
}
}
{
int i=low;
int j=high;
int tmp=data[low];
while(low<hight)
{
while((low<high) && (data[high]>=tmp))
{
--high;
}
data[low]=data[high];
++low;
while((low<high) &&(data[low]<=tmp))
{
++low;
}
data[high]==data[low];
--high;
}
data[low]=tmp;
if(i<low-1)
{
QuickSort(data,i,low-1);
}
if(j>low+1)
{
QuickSort(data,low+1,j);
}
}
快速排序算法的时间复杂度和每次划分的记录关系很大。如果每次选取的记录都能均分成两个相等的子序列,这样的快速排序过程是一棵完全二叉树结构(即每个结点都把当前待排序列分成两个大小相当的子序列结点,n个记录待排序列的根结点的分解次数就构成了一棵完全二叉树),这时分解次数等于完全二叉树的深度log2n。每次快速排序过程无论把待排序列这样划分,全部的比较次数都接近于n-1次,所以,最好情况下快速排序的时间复杂度为O(nlog2n)。快速排序算法的最坏情况是记录已全部有序,此时n个记录待排序列的根结点的分解次数就构成了一棵单右支二叉树。所以在最坏情况下快速排序算法的时间复杂度为O(n2)。一般情况下,记录的分布是随机的,序列的分解次数构成一棵二叉树,这样二叉树的深度接近于log2n,所以快速排序算法在一般情况下的时间复杂度为O(nlog2n)。
另外,快速排序算法是一种不稳定的排序的方法。