十大排序算法之快速排序
• 时间复杂度
○ 采用递归分支的方法,相比冒泡是一种不稳定排序,
○ 时间复杂度最坏是O(n²)
○ 平均时间复杂度是O(nlogn)
○ 最好情况的时间复杂度是O(nlogn)
• 思想
○ 将序列分成连部分,序列左边全部小于一个数,序列右边全部大于一个数,然后递归再将左边当成一个完整序列再进行排序,右边同样
○ 其中这个数在序列中是可以随机的,可以取最左边,也可以最右边,或者随机取。但是通常取最左边
示例
public void quicksort(int [] a,int left,int right)
{
int low=left;
int high=right;
//下面两句的顺序一定不能混,否则会产生数组越界!!!very important!!!
if(low>high)//作为判断是否截止条件
return;
int k=a[low];//额外空间k,取最左侧的一个作为衡量,最后要求左侧都比它小,右侧都比它大。
while(low<high)//这一轮要求把左侧小于a[low],右侧大于a[low]。
{
while(low<high&&a[high]>=k)//右侧找到第一个小于k的停止
{
high--;
}
//这样就找到第一个比它小的了
a[low]=a[high];//放到low位置
while(low<high&&a[low]<=k)//在low往右找到第一个大于k的,放到右侧a[high]位置
{
low++;
}
a[high]=a[low];
}
a[low]=k;//赋值然后左右递归分治求之
quicksort(a, left, low-1);
quicksort(a, low+1, right);
}