P1177 【模板】快速排序

首先,我们需要知道快速排序的理论知识。快速排序,又名快排,嗯,具体实现是从以数组中第一个数据为基点,然后首先以数组的右边开始(至于为什么是从右边开始,后面会提)寻找比此基点小的(看你的需求,如果是要从小到大的话,就是从右边找比基点小的)数,然后退出来,再从数组最左边开始找,找比基点大的,我们这样一直递归下去,因为我们想要达到的是数组左边的数据都是比基点小右边都是比基点大的,最后把基点放入左右边的中点。随着递归的一点点深入,分割的数目也越来越少,这就达成了一个排序的效果。

为什么要从右边开始寻找呢,首先我们要明确我们是为了排序而交换的,所以我们的交换是最终为了达成一个排序的效果。试想以下,如果是从左边开始找,如果找到的数比中间的右边第一个还要小,那我们怎么去交换呢?因为如果这样子再去交换的话,就会使排序发生错误。

这是我从一个博客中看到的,觉得说的很好,“可以看出, 被交换的对象, 总是当前区间内的极左超重与极右超轻, ( 这个极左超重必须位于极右超轻的左侧)接下来会对处于两者中间的剩余区间进行同样的处理, 这样一个回合下来, 本区间汇合点左边都是超轻, 右边都是超重了”,原因大致就是这样了。

#include <iostream>

#include <cmath>

#include <memory.h>

#include <algorithm>

using namespace std;

int a[111111];

void fast(int left,int right)
{
    if(left>right)
        return;
   int l=left,r=right,temp=a[left];
   while(l<r)
   {
       while(l<r&&temp<=a[r])
        r--;
       while(l<r&&temp>=a[l])
        l++;
       if(l<r)
       {
           int t=a[l];
           a[l]=a[r];
           a[r]=t;
       }
   }
   a[left]=a[l];
   a[l]=temp;
   fast(left,r-1);
   fast(r+1,right);
}
int main()
{
    int n;
    cin >>n;
    for(int i=0;i<n;i++)
        cin >>a[i];
    fast(0,n-1);
    for(int i=0;i<n;i++)
        if(i==n-1)
            cout <<a[i]<<"\n";
    else
        cout <<a[i]<<" ";
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值