坐在马桶上看算法:快速排序

初始状态:6  1  2 7  9  3  4  5 10  8

排序的过程图

 

首先哨兵j开始出动。因为此处设置的基准数是最左边的数,所以需要让哨兵j先出动,这一点非常重要(请自己想一想为什么)  ::最后和基准数交换的一定是小于基准数的数、

#include <cstdio>
#include <algorithm>
using namespace std;
int s[100],n;
void quick_sort(int left,int right){//left--right的区间排序
    if(left>=right) return;
    int tm=s[left];  //基准数
    int i=left,j=right;
    while(i!=j){
        while(s[j]>=tm&&i<j)    j--;  //从右边往左边找
        while(s[i]<=tm&&i<j) i++;  //从左往右找
        if(i<j)swap(s[i],s[j]);
    }
    swap(s[left],s[i]);
    quick_sort(left,i-1);quick_sort(i+1,right);
}

int main(){
    //freopen("data.in","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",s+i);
    quick_sort(1,n);
//    for(int i=1;i<=n;i++)   printf("%d ",s[i]);
//    printf("\n");
}

posted on 2016-07-25 15:05  acmtime  阅读(494)  评论(0)    收藏  举报

导航