快速排序

 

【最终版】

#include<cstdio>
#include<algorithm>
using namespace std;
int a[100050],n;
void Qsort(int l,int r){
    int mid=a[(l+r)/2],i=l,j=r;
    while(i<=j){
        while(a[i]<mid)i++;
        while(a[j]>mid)j--;
        if(i<=j){swap(a[i],a[j]);i++;j--;}
    }
    if(i<r)Qsort(i,r);
    if(l<j)Qsort(l,j);
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    Qsort(1,n);
    for(int i=1;i<=n-1;i++)printf("%d ",a[i]);
    printf("%d\n",a[n]);
    return 0;
}

  

 

 

快速排序=挖坑填数+分治法

【举例】

66 13 51 76 81 26 57 69 23
23 13 51 57 26 66 81 69 76

 

【C++版】

void Qsort(int L,int R){
    int i=L,j=R,t=a[i];    //在i处挖坑
    while(i<j){
        while(i<j && a[j]>=t)j--;
        if(i<j){a[i]=a[j]; i++; }  //挖j填i
        while(i<j && a[i]<=t)i++;
        if(i<j){a[j]=a[i]; j--; }  //挖i填j
    }
    a[i]=t;  //填i
    if(l<i-1) Qsort(l,i-1); 
    if(r<j+1) Qsort(i+1,r);
}

  

posted @ 2016-10-10 01:32  qilinart  阅读(661)  评论(0)    收藏  举报