快速排序

快排的思想是分治法
我们基于快排的分治法
得到start和aim的mid 然后不断分治求解
有人会问 这个mid是怎么得出来的 这个mid的位置是由get_mid这个函数得到的
这个函数的作用是什么呢?
就是先假设start是空的,我们把start这个位置的数保存到temp中
然后在aim往前找 找到一个不大于temp的数 然后交换到start的位置
有没有发现 我们以temp这个数(也就是原来的a[start])为基准 将不大于temp的数放到start位置 也就是放在前面 然后我们把不小于temp的数放在了后面
最后 我们以temp这个数为标准 前面的数都不大于temp 后面的数都不小于temp
然后我们返回这个temp的位置 就是此时的start 注意 这个start不是一开始的start了 是不断在++的
经过这一次的排序 我们确定了一个基准 也就是mid前面的数都不大于a[mid] mid后面的数都不小于a[mid]
然后递归分治求解

#include<cstdio>

const int maxn=5005;
int a[maxn];
int n;

int get_mid(int start,int aim){
    int temp=a[start];
    while(start<aim){
        while(start<aim&&a[aim]<=temp)aim--;
        a[start]=a[aim];
        while(start<aim&&a[start]>=temp)start++;///我们找到一个不大于temp的放到start位置,在找到一个不小于temp的放到aim 因为如果aim不减 start不加 我们永远无法退出while(start<aim)循环
    }
    a[start]=temp;
    return start;
}
void sort_(int start,int aim){
    if(start<aim){
        int mid=get_mid(start,aim);
        sort_(start,mid);
        sort_(mid+1,aim);
    }
}
int main(){
    while(scanf("%d",&n)==1){
        for(int i=0;i<n;i++)scanf("%d",&a[i]);
        sort_(0,n-1);
        for(int i=0;i<n;i++){
            printf("%d ",a[i]);
        }
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(快速排序)