1.代码实现
#include<stdio.h>
int quicksort(int _left,int _right,int a[])
{
int pd1=0,pd2=0;//这两个变量检测数组是否已经提前排好序,减少时间复杂度
int left=_left,right=_right;
int pole=_left, kl;
if (_left >= _right) return 0; // 递归终止条件(当此部分数组过小结束)
while (left != right)//总循环,进行一次左或右循环后,left或者right会自动和pole重合,不用再做判断
{
while (right > pole)//右循环
{
if (a[right] < a[pole])
{
pd1 = 1;//如果右循环执行过,则数组可能还未排好序,下一次继续嵌套
kl = a[right]; a[right] = a[pole]; a[pole] = kl;//内容互换
pole = right;
break;
}
else right--;
}
while (left < pole)//左循环
{
if (a[left] > a[pole])
{
pd2 = 1;//如果左循环执行过,则数组可能还未排好序,下一次继续嵌套
kl = a[left]; a[left] = a[pole]; a[pole] = kl;//内容互换
pole = left;
break;
}
else left++;
}
}
if(pd1==0&&pd2==0)//如果下面两个嵌套函数都排好序,则函数终结
return 0;
//注意:下面两个嵌套函数是顺序执行的,先将pd1排好序,再排pd2
if (pd1 == 1)
quicksort(_left, pole - 1, a);//left
if(pd2 == 1)
quicksort(pole + 1, _right, a);//right
}
int main()
{
int a[] = { 3,4,6,1,2,4,7 };
quicksort(0, 6, a);
for (int i = 0; i < 7; i++)
{
printf("%d ", a[i]);
}
return 0;
}
2.算法分析
策略:采用分治法
-
分治法的步骤:
- 划分:选择一个枢轴(pole),将数组划分为两部分,一部分的所有元素小于等于枢轴,另一部分的所有元素大于等于枢轴。
- 递归:对划分后的两部分分别递归地进行排序。
- 合并:由于快速排序是就地排序,所以不需要显式的合并步骤,排序完成后数组自然就是有序的。
时间复杂度
最佳情况:O(nlogn)
平均情况:O(nlogn)
最坏情况:O(n2)