zoukankan      html  css  js  c++  java
  • 双关键字快排

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

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

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

    下面附上代码:

     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 }

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

  • 相关阅读:
    最全 C 语言常用算法详解-排序-队列-堆栈-链表-递归-树 (面试有用)
    iOS多线程各种安全锁介绍
    将openfire部署到CentOS云服务器上
    触摸事件MultiTouch Events
    Usaco 2006Nov Round Numbers
    Codeforces 850C Arpa and a game with Mojtaba
    HDU4466 Triangle
    Codeforces Gym 101521A Shuttle Bus
    Codeforces 817F MEX Queries
    Codeforces 482B Interesting Array
  • 原文地址:https://www.cnblogs.com/itlqs/p/4750067.html
Copyright © 2011-2022 走看看