quicksort

#include<stdio.h>
#include<algorithm>
using namespace std;
int A[100000];
/*
At the beginning of each iteration of the loop , for any array
index k,
1. If p <= k <= i, then A[k]<= pivot.
2. If i+1 <= k <= j-1, then A[k] > pivot.
3. If k = r, then A[k] = pivot.
4. If j <= k <=r-1 , unknown.
*/
int PARTITION(int A[],int p,int r)
{
    int pivot=A[r];
    int i=p-1,j;
    for(j=p;j<r;j++)
        if(A[j]<=pivot) swap(A[++i],A[j]);
    swap(A[++i],A[r]);
    return i;
}
void QUICKSORT(int A[],int p,int r)
{
    if(p<r){
        int q=PARTITION(A,p,r);
        QUICKSORT(A,p,q-1);
        QUICKSORT(A,q+1,r);
    }
}
int main(void)
{
    //freopen("1.txt","r",stdin);
    //freopen("2.txt","w",stdout);
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",A+i);
    QUICKSORT(A,1,n);
    for(int i=1;i<=n;i++) printf("%d ",A[i]);
    return 0;
}






quicksort partition将数组划分成3部分,小于pivot,等于pivot,大于pivot

  1. //partition将数组划分成3部分,小于pivot,等于pivot,大于pivot  
  2. #include<stdio.h>  
  3. #include<algorithm>  
  4. using namespace std;  
  5. int A[100000];  
  6. struct T{  
  7.     int q,t;  
  8. };  
  9. /* 
  10. loop invariant: 
  11. A[p...i-1] < pivot A[i...h]的所有元素都小于pivot 
  12. A[i...h] = pivot 
  13. A[h+1...j-1] > pivot 
  14. A[j...r] unknown,因为还没有考察到它们的值 
  15. */  
  16. T PARTITION_3parts(int A[],int p,int r)  
  17. {  
  18.     int pivot=A[r],i=p,h=p-1,j;  
  19.   
  20.     for(j=p;j<=r;j++)  
  21.         if(A[j]<pivot){  
  22.             int temp=A[j];//保存正在处理的A[j]  
  23.             A[j]=A[h+1];//大于pivot部分后移1位  
  24.             A[h+1]=A[i];//等于pivot部分后移1位  
  25.             A[i]=temp;//temp去到小于pivot部分的末尾  
  26.             i++;h++;  
  27.         }  
  28.     else if(A[j]==pivot) swap(A[j],A[++h]);  
  29.     T t={i,h};  
  30.     return t;  
  31. }  
  32. void QUICKSORT_3parts(int A[],int p,int r)  
  33. {  
  34.     if(p<r){  
  35.         T t=PARTITION_3parts(A,p,r);  
  36.         QUICKSORT_3parts(A,p,t.q-1);  
  37.         QUICKSORT_3parts(A,t.t+1,r);  
  38.     }  
  39. }  
  40. int main(void)  
  41. {  
  42.     //freopen("1.txt","r",stdin);  
  43.     //freopen("2.txt","w",stdout);  
  44.     int n;  
  45.     scanf("%d",&n);  
  46.     for(int i=1;i<=n;i++) scanf("%d",A+i);  
  47.     QUICKSORT_3parts(A,1,n);  
  48.     for(int i=1;i<=n;i++) printf("%d ",A[i]);  
  49.     return 0;  


HOARE_QUICKSORT 算法导论上提供的Hoare的原版PARTITION


  1. #include<stdio.h>  
  2. #include<algorithm>  
  3. using namespace std;  
  4. int A[100000];  
  5. //算法导论上提供的Hoare的原版PARTITION  
  6. /* 
  7. 1.The indices i and j are such that we never access an element of A outside the 
  8. subarray A[p...r]. 
  9. 2.When HOARE-PARTITION terminates, it returns a value j such that p <= j < r. 
  10. 3.Every element of A[p...j] is less than or equal to every element of A[j+1...r] 
  11. when HOARE-PARTITION terminates. 
  12. */  
  13. int HOARE_PARTITION(int A[],int p,int r)  
  14. {  
  15.     int pivot=A[p];  
  16.     int i=p-1,j=r+1;  
  17.     while(1){  
  18.         do{j--;}while(A[j]>pivot);  
  19.         do{i++;}while(A[i]<pivot);  
  20.         if(i<j) swap(A[i],A[j]);  
  21.         else return j;  
  22.     }  
  23.     return i;  
  24. }  
  25. void HOARE_QUICKSORT(int A[],int p,int r)  
  26. {  
  27.     if(p<r){  
  28.         int q=HOARE_PARTITION(A,p,r);  
  29.         HOARE_QUICKSORT(A,p,q);//A[p...j]  
  30.         HOARE_QUICKSORT(A,q+1,r);//A[j+1...r]  
  31.     }  
  32. }  
  33. int main(void)  
  34. {  
  35.     //freopen("1.txt","r",stdin);  
  36.     //freopen("2.txt","w",stdout);  
  37.     int n;  
  38.     scanf("%d",&n);  
  39.     for(int i=1;i<=n;i++) scanf("%d",A+i);  
  40.     HOARE_QUICKSORT(A,1,n);  
  41.     for(int i=1;i<=n;i++) printf("%d ",A[i]);  
  42.     return 0;  




快速排序的随机化版本 

  1. #include<stdio.h>  
  2. #include<algorithm>  
  3. using namespace std;  
  4. int A[100000];  
  5. /* 
  6. At the beginning of each iteration of the loop , for any array 
  7. index k, 
  8. 1. If p <= k <= i, then A[k]<= pivot. 
  9. 2. If i+1 <= k <= j-1, then A[k] > pivot. 
  10. 3. If k = r, then A[k] = pivot. 
  11. 4. If j <= k <=r-1 , unknown. 
  12. */  
  13. int PARTITION(int A[],int p,int r)  
  14. {  
  15.     int pivot=A[r];  
  16.     int i=p-1,j;  
  17.     for(j=p;j<r;j++)  
  18.         if(A[j]<=pivot) swap(A[++i],A[j]);  
  19.     swap(A[++i],A[r]);  
  20.     return i;  
  21. }  
  22. int RANDOMIZED_PARTITION(int A[],int p,int r)  
  23. {  
  24.     int i=rand()%(r-p+1)+p;//随机选取A[p...r]其中一个做主元  
  25.     swap(A[i],A[r]);  
  26.     return PARTITION(A,p,r);  
  27. }  
  28. void QUICKSORT(int A[],int p,int r)  
  29. {  
  30.     if(p<r){  
  31.         int q=RANDOMIZED_PARTITION(A,p,r);  
  32.         QUICKSORT(A,p,q-1);  
  33.         QUICKSORT(A,q+1,r);  
  34.     }  
  35. }  
  36. int main(void)  
  37. {  
  38.     //freopen("1.txt","r",stdin);  
  39.     //freopen("2.txt","w",stdout);  
  40.     int n;  
  41.     scanf("%d",&n);  
  42.     for(int i=1;i<=n;i++) scanf("%d",A+i);  
  43.     QUICKSORT(A,1,n);  
  44.     for(int i=1;i<=n;i++) printf("%d ",A[i]);  
  45.     return 0;  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值