双关键字快排
其实如果理解了快排的原理,双关键字快排其实是很简单的。
因为快排的思想是在待排序序列中选取一个记录,让它左边的都小于等于它,右边的都大于等于它,如此递归。
那么双关键字的思想就顺其自然:在待排序序列中选取一个记录,让它左边的第一关键字小于它,或者第一关键字等于它但是第二关键字小于它;右边的第一关键字大于它,或者第一关键字等于它但是第二关键字大于它,如此递归。(读起来有点绕,但是对照上一句仔细读读还是可以读懂的)
下面附上代码:
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 }
其实这个程序就把不稳定的快排变成了稳定的快排了!(因为添加了一个关键字,对于相等的就实现了本来在前面的还在前面)