先看普通版本
#include<stdio.h> int Partition(int A[],int p,int r) { //最后一个r做pivot int tmp; int i=p-1; int j=p; for(j=p;j<=r-1;j++) if(A[j]<=A[r])
{ i++; tmp=A[i];A[i]=A[j];A[j]=tmp; } tmp=A[i+1],A[i+1]=A[r],A[r]=tmp; return i+1; } void QuickSort(int A[],int p,int r) { int q; if(p<r) { q=Partition(A,p,r); QuickSort(A,p,q-1); QuickSort(A,q+1,r); } } int main() { int i,n; int arr[20]; printf("请输入数组的大小"); scanf("%d",&n); printf("请输入数组元素\n"); for(i=0;i<n;i++) scanf("%d",arr+i); QuickSort(arr,0,n-1); printf("快速排序结果为\n"); for(i=0;i<n;i++) printf("%d\t",arr[i]); }
随机化是从a[p...r]中随机选出的一个元素交换。
随机化代码是quicksort划分时q=randomized_partition;
randomized_partition(int a[],int p,int r) {
srand(time(NULL)); //产生不同的种子 int i=rand()%(r-p+1)+p; // [p,r]; { int tmp=a[r];a[r]=a[i];a[i]=tmp; } return partition(a,p,r); }
rand()在stdlib.h头文件中。time在头文件time.h中.
快速排序partition还有一个版本比较流行。
int partition2(int a[],int p,int r) { int i,j; //a[p] pivot i=p+1; j=r;
//这里不能写成while(l<r),否则不会正确排序,比如 5,3,-1,4,7 while(1) { while(a[i]<a[p]) i++; while(a[j]>a[p]) j--; if(i>=j) break; int tmp=a[i],a[i]=a[j],a[j]=tmp; } int tmp=a[j],a[j]=a[p],a[p]=tmp; //不能写成swap(a[i],a[p]),只能是j. return j; }
为什么不能写成
wap(a[i],a[p]),只能是j.可以用2,1,3举例。
最后i变成了2,j变成1。只能是j是因为a[j]一定是小于pivot的。
更简单代码:
int Partition(int a[],int p,int r) { int i=p,j=r+1; int x=a[p]; while(1) { while(a[++i]<x && i<r); while(a[--j]>x); if(i>=j) break; int temp; //交换两个数的值 temp=a[j]; a[j]=a[i]; a[i]=temp; } a[p]=a[j]; a[j]=x; return j; }