快速排序(Quicksort)

快速排序

  • 快速排序(Quicksort)的思想是分治(Divide and conquer),顾名思义将一个串分成两个串,再讲其中一个继续分治,直到全部完成。
  • 算法描述
    • 1.从数列中选取一个分界点
    • 2.分区操作,基于分界点,将整个数列进行排序,所有小于分界点的数放在分界点左边,所有大于分界点的数放在分界点右边,和分界点相等的数可以到任意一边,此后,分界点就会在整个数列的中间位置。
    • 3.递归的把左右两个子数列进行排序。
  • 时间复杂度(平均复杂度):n log n

常用时间复杂度排序:

O( 1 )<O( longn )<O( n )<O(n longn )<O( n^2 )<O( n^3 )<O(2^n)

快排模板如下:

void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;//如果待排列的数组p里面数字只有一个或者为空的情况下
    int x = q[ l ],i = l - 1, j = r + 1;//x为选的分界点,如果取/2,可能依然会报错(内存溢出),但是用位运算符就可以AC,以为CPU对于位运算符的处理速度比/2快很多
    while(i < j)
    {
        do i++ ; while (q[i] < x);
        do j-- ; while (q[j] > x);
        if(i < j) swap(q[i],q[j]);
    }
    quick_sort(q,l,j);
    quick_sort(q,j + 1,r);
}
void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;//如果待排列的数组p里面数字只有一个或者为空的情况下
    int x = q[(l + r + 1) / 2],i = l - 1, j = r + 1;//x为选的分界点,此时x不能选l,会出现死循环
    while(i < j)
    {
        do i++ ; while (q[i] < x);
        do j-- ; while (q[j] > x);
        if(i < j) swap(q[i],q[j]);
    }
    quick_sort(q,l,j);
    quick_sort(q,j + 1, r);
}
注意
  • 比如说取左边界int x = q[l]; quick_sort(q,l,i - 1); quick_sort(q,i,r),对于数组0,1进行快排,选0为分界点,i指向0,j指向1,i不满足,继续指向0,j满足大于0,j指向0,此时i和j相遇,分为左右数组,左边的是quick_sort(q[2],0, - 1),右边的是quick_sort(q[2],0,2),右边的数组将陷入死循环。

  • 当x=q[l+r>>1]的边界情况,此时x取的是序列中间靠左的位置(如果序列个数为奇,则取正中间,如果为偶,则取中间靠左),此时如果元素个数为2,
    则中间靠左就是第1个元素,这时就跟x=q[l]的边界情况一致了,所以这时只能用sort(l,j),sort(j+1,r);

  • 当x=q[l+r + 1>>1]的边界情况
    此时x取的是序列中间靠右的情况,同理,当元素只有两个,情况就会类似x=q[r],此时只能用sort(l,i-1),sort(i,r);

  • 如果x=q[l] or x=q[l+r>>1]此时只能用sort(l,j),sort(j+1,r);
    如果x=q[r] or x=q[l+r + 1>>1]此时只能用sort(l,i-1),sort(i,r);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值