多关键字的快速排序

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

 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 }
多关键字快速排序
原文地址:https://www.cnblogs.com/holyprince/p/3314842.html