手打快排

快排:快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。然后分治基准位置的左侧和右侧。

 

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
void mysort(int *A,int L,int R){
    //从小到大排序
    if(L<R){

        int key,low,high;
        key=A[L]; //取一个基准值,可以是任意,但这里用的是区间最左边的值
        low=L;      //区间左边指针low
        high=R;     //区间右边指针high
        while(low<high){

            while(low<high&&A[high]>=key){
            //这里是递增排序
                high--;//区间右端的值大于基准,右端指针向区间左侧逼近
            }
            if(low<high)    //减少重复操作
                A[low++]=A[high];//小于基准的放左边
            while(low<high&&A[low]<=key){

                low++;//区间左端的值小于于基准,左端指针向区间右侧逼近
            }
            if(low<high)
               A[high--]=A[low]; //大于基准的放右边
        }
        A[low]=key;//将基准放到相对于基准来说已经有序的位置(即基准左侧都小于基准值,右侧都大于基准值)
        mysort(A,low+1,R);//分治基准左侧
        mysort(A,L,low-1);//分治基准右侧
    }
}
int main(){

    int n;
    int a[1000];
    scanf("%d",&n);
    for(int i=0;i<n;i++){

        scanf("%d",&a[i]);
    }
    mysort(a,0,n-1);
    for(int i=0;i<n;i++)
        printf("%d\n",a[i]);
    return 0;
}

/*
5
1 2 0 6 -4
*/

  

posted @ 2015-03-27 21:20  tcgoshawk  阅读(357)  评论(0编辑  收藏  举报