快速排序 求第k大数

这篇博客探讨了如何运用快速排序的思想来解决求解第k大数的问题。通过不完全排序,只需要关注与k相关的部分,可以高效地定位到第k大数值。这种方法强调了快速排序的适应性和效率,尤其在处理范围问题时。
  1. 快排利用标兵的思想,但每一次都是比较范围大小,没有精确排序。
  2. 同样适用于快速求解 需要定性的范围问题,例如:第k大(将前后定性大小,但不用排序).
  3. 求解第k大:通过判断下标,只计算有k的那一半。
  4. 快排是从广到窄的递归。
  5. 快排:a.枢轴要回归.b.i总是指向偏大的值.

    void quick_sort(int *A, int x, int y)//左闭右闭
    {
    if(x < y)//当有10个元素是退出
    {
      int i = x;
      int j = y;
    //取中值,优化快排速度,优化效果明显,4%~5%。
      int m = x + (y-x)/2;
      if(A[x] > A[m])
          if(A[x] > A[y])
              if(A[m] > A[y])
                  swap(A[m],A[y]);
          else
              swap(A[x],A[y]);
      else//A[x]<A[m]
          if(A[x] > A[y])
              swap(A[x],A[y]);
          else
              if(A[y] > A[m])
                  swap(A[m],A[y]);
    //优化结束
      int key = A[y];
    
      while(true)
      {
          while(i < j && A[i] <= key)//因为先从左开始遍历,所以A[i]一定是偏大的值
              ++i;
          while(i < j && A[j] >= key)
              --j;
          if(i < j)
              swap(A[i],A[j]);
          else
              break;
          ++i;//不能同时--j,否则会有bug。
      }
      swap(A[i],A[y]);//将枢纽归位
    
      quick_sort( A,x, i-1);
      quick_sort( A,i+1, y);
    }
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值