赞
踩
快速排序的时间复杂度为O(nlogn)。
关于快速排序的几点注意事项:
具体步骤:
以 18 53 8 12 1 47 6 23为例,以18为flag,具体步骤如下(蓝色代表low,红色代表high)
2.此时high->6,因为6<18,所以将6赋给low对应的值,并移动low(因为赋值过后low的值变成6,6一定小于18,所以直接移动low即可,后面以此类推)
3.此时low->53,因为53>18,所以将53赋值给high对应的值并移动high
4.此时high->47,因为47>18,所以继续左移high
5.此时high->1,因为1<18,所以将1赋给low对应的值,并右移low
6.此时low->8,因为8<18,继续右移low
7.此时low->12,因为12<18,继续右移low
8.此时low high重合,将flag值放到该下标即可。
这样,找到了第一个中间元素,左边的元素一定不大于flag,右边的元素一定不小于flag。
以此类推,处理flag左边的部分和flag右边的部分即可,直到长度为1停止。
代码如下(flag代表每次选出的中间数,左边不大于flag,右边不小于flag):
int sort(int *s,int low,int high)
{
int flag=s[low];
while(low<high)//high low重合停止
{
while(low<high&&flag<=s[high])
{
high--;//flag不大于high指向元素,high继续左移
}
if(low<high)
{//遇到需要放到左边元素,将high指向元素直接赋值到low位置
s[low]=s[high];
}
//有交换操作后开始移动L
while(low<high&&flag>=s[low])
{
low++;//flag不小于low指向元素,low继续右移
}
if(low<high)
{
//遇到需要放到右边元素,将low指向元素直接赋值到high位置
s[high]=s[low];
}
//交换操作之后继续执行high左移操作直到high low重合
}
s[high]=flag;//将flag放到high low重合位置
return high;
}
int quick_sort(int *s,int low,int high)
{
int ret=0;
if(low<high)//序列长度为1作为递归出口,此时low>=high
{
ret=sort(s,low,high);//函数返回了low high重合位置
quick_sort(s,ret+1,high);
quick_sort(s,low,ret-1);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。