基本思想:
通过分而治之的方式来将一个数组排序,并使用函数递归的方法。
步骤1:找一个基准值(一般是首元素)
步骤2:从右向左找第一个比基准值小的值
步骤3:从左向右找第一个比基准值大的值
步骤4:将找到的位置的值交换
步骤5:重复步骤2~4,直到begin 与 end 相遇,将相遇位置上的值与基准位置上的值交换
步骤6:分别对比基准值小的一半继续排序,对比基准值大的一半继续排序
#include <stdio.h>
void printArray(int *begin, int *end)
{
while(begin<=end)
{
printf("%d ",*begin++);
}
putchar('\n');
}
void swap(int *p, int *q)
{
int t = *p;
*p = *q;
*q = t;
}
void quickSort(int *begin, int *end)
{
//记录每次起始位置、结束位置
int *p = begin;
int *q = end;
if(begin>end)//排序结束条件
{
return;
}
//找一个基准值
int *k = begin;
while(begin < end)
{
while(begin < end && *k <= *end)//从右向左找第一个比基准值小的值
{
--end;
}
while(begin < end && *k >= *begin)//从左向右找第一个比基准值大的值
{
++begin;
}
swap(begin,end);//将找到位置的值交换
}
swap(k,begin);//begin与end相遇后,将基准值与begin(end)交换 //swap(k,end);
//递归调用
quickSort(p,end-1);//对比基准值小的一半继续排序
quickSort(begin+1,q);//同理
}
int main(void)
{
int a[] = {4,7,5,1,2,3,6};
int *k = &a[0];
quickSort(a,a+6);
printArray(a,a+6);
return 0;
}
时间复杂度:
快速排序的最优时间复杂度和平均时间复杂度为:O(nlog(n)),是最好的情况。
最坏的情况为:O(n^2)。
对于平均情况,每一次选择的分界值可以看作是等概率随机的。
稳定性:
快速排序是一种不稳定的排序算法
487

被折叠的 条评论
为什么被折叠?



