双关键字快排

双关键字快排

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

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

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

下面附上代码:

复制代码
 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 }
复制代码

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

欢迎关注我的博客,在数据爆炸的时代,需要信息的权威性和去冗余化。 *转载请注明出处*(由于服务器维护,原来的一些链接可能失效,敬请谅解…)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值