快速排序算法

        快速排序最初是由Tony Hoare设计的,其最坏情况下的时间复杂度为O(n^2),即逆序的情况下,但是现实中这种情况比较少见,所以是一种很有效的排序算法,其平均时间复杂度为O(n*logn)。而且快排是一个不稳定的排序算法。
       快速排序使用分治法的策略来把一个待排序数组分成两个部分,事先定义好一个基准数,左边为小于该基准数的,而右边则是大于基准数。步骤为:
从数组中挑出一个元素,成为基准数;
       重新排序数列,所有元素比基准数小的放在基准数前面,所有元素比基准数大的放在基准数的后面(相同的数可以放到任一边)。在这个分区退出来之后,该基准数就位于该数列的中间位置。这个操作成为分区(partition),是快排的核心;
递归地把小于基准数元素的子数列和大于基准数元素的子数列排序。
此算法可以用代码被表示为:
void quickSort(int a[],int p,int r)
{
if(p
{
    int i, m;
    if (p >=r) return;
    m = p;
    for (i = p+1; i <= r; i++)
        if (x[i] < x[l])
            swap(++m, i);
    swap(p, m);
    quickSort(a,p,m-1);
    quickSort(a,m+1,r);
}
快速排序最大的不足就是对于相对有序的数组排序效率很低,而且当数组较短时快速排序并不是最快的。应对这些情况有三种简单常用的改进:
随机化改进:不是选取第一个值为基准,而是随机选取。
平衡化改进:取第一个、最后一个和中间点三个值中中间值为基准进行排序。
设置阀值--混合排序:当数组长度小于某一值时使用其他较快的排序。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值