快速排序

快速排序是基于分治的思想,每次都选择一个基准数,使得左边的都小于基准数,右边都大于基准数(默认基准数为每个排列第一个数),所以基本的思想是用两个指针,分别从最左边和最右边开始寻找,两个如果都找到了话就交换两个数字,需要注意的是,先从左边扫?还是先从右边扫,考虑21(基准数为2)这种情况,如果先从左边扫,寻找大于基准数的数字,找不到.算法结束,如果先从右边扫,寻找小于基准数的数字,找到了为1,交换变为12,综上,必须先从右边扫,再从左边扫(从小到大排列).

思考一下,如果是从大到小排列呢(左边比基准数大,右边比基准数小)?考虑12(基准数为1),如果先从左边扫,寻找小于基准数的数字,找到了1,交换得到序列21.算法结束,如果先从右边扫,寻找大于基准数的数字,找不到,综上,必须先从左边扫,再从右边扫(从大到小排列).

#include "iostream"
using namespace std;
const int maxn=1000;
int a[maxn];
int n;
void quicksort(int l,int r){
    if (l>r) {
        return;
    }
    int i=l,j=r;
    while (i<j) {//最后左边都小于基准数,右边都大于基准数
        while (i<j &&a[j]>=a[l]) {//先寻找小于基准数的,i<j必须有
            j--;
        }
        while (i<j &&a[i]<=a[l]) {//寻找大于基准数的,i<j必须有
            i++;
        }
        swap(a[i], a[j]);
    }
    swap(a[l], a[j]);//i or j
    quicksort(l, i-1);//i or j
    quicksort(i+1, r);//i or j
}
int main(){
    cin>>n;
    for (int i=1; i<=n; i++) {
        cin>>a[i];
    }
    quicksort(1, n);
    for (int i=1; i<=n; i++) {
        cout<<a[i]<<' ';
    }
    cout<<endl;
}//10 6 1 2 7 9 3 4 5 10 8
//10 6 1 2 7 9 11 4 5 10 9




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值