#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
- //partition将数组划分成3部分,小于pivot,等于pivot,大于pivot
- #include<stdio.h>
- #include<algorithm>
- using namespace std;
- int A[100000];
- struct T{
- int q,t;
- };
- /*
- loop invariant:
- A[p...i-1] < pivot A[i...h]的所有元素都小于pivot
- A[i...h] = pivot
- A[h+1...j-1] > pivot
- A[j...r] unknown,因为还没有考察到它们的值
- */
- T PARTITION_3parts(int A[],int p,int r)
- {
- int pivot=A[r],i=p,h=p-1,j;
- for(j=p;j<=r;j++)
- if(A[j]<pivot){
- int temp=A[j];//保存正在处理的A[j]
- A[j]=A[h+1];//大于pivot部分后移1位
- A[h+1]=A[i];//等于pivot部分后移1位
- A[i]=temp;//temp去到小于pivot部分的末尾
- i++;h++;
- }
- else if(A[j]==pivot) swap(A[j],A[++h]);
- T t={i,h};
- return t;
- }
- void QUICKSORT_3parts(int A[],int p,int r)
- {
- if(p<r){
- T t=PARTITION_3parts(A,p,r);
- QUICKSORT_3parts(A,p,t.q-1);
- QUICKSORT_3parts(A,t.t+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_3parts(A,1,n);
- for(int i=1;i<=n;i++) printf("%d ",A[i]);
- return 0;
- }
HOARE_QUICKSORT 算法导论上提供的Hoare的原版PARTITION
- #include<stdio.h>
- #include<algorithm>
- using namespace std;
- int A[100000];
- //算法导论上提供的Hoare的原版PARTITION
- /*
- 1.The indices i and j are such that we never access an element of A outside the
- subarray A[p...r].
- 2.When HOARE-PARTITION terminates, it returns a value j such that p <= j < r.
- 3.Every element of A[p...j] is less than or equal to every element of A[j+1...r]
- when HOARE-PARTITION terminates.
- */
- int HOARE_PARTITION(int A[],int p,int r)
- {
- int pivot=A[p];
- int i=p-1,j=r+1;
- while(1){
- do{j--;}while(A[j]>pivot);
- do{i++;}while(A[i]<pivot);
- if(i<j) swap(A[i],A[j]);
- else return j;
- }
- return i;
- }
- void HOARE_QUICKSORT(int A[],int p,int r)
- {
- if(p<r){
- int q=HOARE_PARTITION(A,p,r);
- HOARE_QUICKSORT(A,p,q);//A[p...j]
- HOARE_QUICKSORT(A,q+1,r);//A[j+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);
- HOARE_QUICKSORT(A,1,n);
- for(int i=1;i<=n;i++) printf("%d ",A[i]);
- return 0;
- }
快速排序的随机化版本
- #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;
- }
- int RANDOMIZED_PARTITION(int A[],int p,int r)
- {
- int i=rand()%(r-p+1)+p;//随机选取A[p...r]其中一个做主元
- swap(A[i],A[r]);
- return PARTITION(A,p,r);
- }
- void QUICKSORT(int A[],int p,int r)
- {
- if(p<r){
- int q=RANDOMIZED_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;
- }