• 双关键字快排


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

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

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

    下面附上代码:

     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 }

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

  • 相关阅读:
    [LOJ#6284.数列分块入门8] ODT(珂朵莉树)解法
    [CF Contest] Sum of Round Numbers 题解
    基础数论记录
    [CF Contest] Kana and Dragon Quest game 题解
    hexo上怎么写博客
    keepalived的部署
    python局部和全局变量
    python发送邮件
    lamp架构的部署
    rayns数据同步
  • 原文地址:https://www.cnblogs.com/itlqs/p/4750067.html
Copyright © 2020-2023  润新知