双关键字快排

其实如果理解了快排的原理,双关键字快排其实是很简单的。

因为快排的思想是在待排序序列中选取一个记录,让它左边的都小于等于它,右边的都大于等于它,如此递归。

那么双关键字的思想就顺其自然:在待排序序列中选取一个记录,让它左边的第一关键字小于它,或者第一关键字等于它但是第二关键字小于它;右边的第一关键字大于它,或者第一关键字等于它但是第二关键字大于它,如此递归。(读起来有点绕,但是对照上一句仔细读读还是可以读懂的)

下面附上代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 void myqsort(int *a,int *b,int left,int right)
 5 {
 6     int i=left;
 7     int j=right;
 8     int mid=a[(left+right)/2];
 9     int midb=b[(left+right)/2];
10     int temp;
11     while (i<j)
12     {
13         while (a[i]<mid||a[i]==mid&&b[i]<midb) i++;
14         while (a[j]>mid||a[j]==mid&&b[j]>midb) j--;
15         if (i<=j)
16         {
17             temp=a[i];
18             a[i]=a[j];
19             a[j]=temp;
20             temp=b[i];
21             b[i]=b[j];
22             b[j]=temp;
23             i++;
24             j--;
25         }
26     }27     if (i<right) myqsort(a,b,i,right);
28     if (left<j) myqsort(a,b,left,j);
29 }
30 
31 int main()
32 {
33     int n;
34     scanf("%d",&n);
35     int i;
36     int *a=(int *)malloc(n*sizeof(int));
37     int *b=(int *)malloc(n*sizeof(int));    
38     for (i=0;i<n;i++)
39     {
40           scanf("%d",a+i);
41           *(b+i)=i;
42       }
43       myqsort(a,b,0,n-1);
44       for (i=0;i<n;i++)
45     {
46         printf("%d ",*(a+i));
47     }
48     free(a);
49     free(b);
50     return 0;
51 }

其实这个程序就把不稳定的快排变成了稳定的快排了!(因为添加了一个关键字,对于相等的就实现了本来在前面的还在前面)

posted @ 2015-08-22 13:11  lvmememe  阅读(1443)  评论(0编辑  收藏  举报