每次考核前都会回忆起这个记了又忘,忘了又记的代码,快排的一些边缘情况的考虑感觉很麻烦,而每次考前时间都很紧迫只能使用一个基本正确的代码:

1 #include<stdio.h> 2 int a[4]={-34,9,3,0}; 3 void swap(int &x,int &y) 4 { 5 int t=x; 6 x=y; 7 y=t; 8 } 9 10 int parttion(int a[],int l,int r) 11 { 12 int i=l,j=r+1; 13 int x=a[l]; 14 while(true) 15 { 16 while(a[++i]<x&&i<r); 17 while(a[--j]>x); 18 if(i>=j) 19 break; 20 swap(a[i],a[j]); 21 } 22 a[l]=a[j]; 23 a[j]=x; 24 return j; 25 } 26 void qsort(int a[],int l,int r) 27 { 28 if(l<r) 29 { 30 int index=parttion(a,l,r); 31 qsort(a,l,index-1); 32 qsort(a,index+1,r); 33 } 34 } 35 int main () 36 { 37 qsort(a,0,3); 38 return 0; 39 }
刚才现写了一个,发现啊a[++j]的自增运算符的位置放反了。
然后是使用C++风格结构体的多关键字快排:

1 #include<stdio.h> 2 #include <stdlib.h> 3 #include<time.h> 4 struct Node{ 5 int a; 6 int b; 7 Node() 8 { 9 a=0; 10 b=0; 11 } 12 }; 13 int compare(Node a,Node b) 14 { 15 if(a.a==b.a) 16 return a.b-b.b; 17 else 18 return a.a-b.a; 19 } 20 void swap(Node &m,Node &n) 21 { 22 Node temp=m; 23 m=n; 24 n=temp; 25 } 26 int partion(Node a[],int l,int r) 27 { 28 int i=l,j=r+1; 29 Node x=a[l]; 30 while(true) 31 { 32 while(compare(a[++i],x)>0&&i<r); 33 while(compare(x,a[--j])>0); 34 if(i>=j)break; 35 else 36 swap(a[i],a[j]); 37 } 38 a[l]=a[j]; 39 a[j]=x; 40 return j; 41 } 42 void qsort(Node a[],int l,int r) 43 { 44 if(l<r) 45 { 46 int p=partion(a,l,r); 47 qsort(a,l,p-1); 48 qsort(a,p+1,r); 49 } 50 } 51 Node a[10]; 52 int main() 53 { 54 srand((unsigned int)time(0)); 55 for(int i=0;i<10;i++) 56 { 57 a[i].a=rand()%(10+1-0)+0; 58 a[i].b=rand()%(10+1-0)+0; 59 60 } 61 qsort(a,0,9); 62 for(int i=0;i<10;i++) 63 { 64 printf("%d %d ",a[i].a,a[i].b); 65 } 66 }