随机的快速排序算法

仅仅在原来的快速排序基础上增加了取随机数为划分点,改进了原有快排使用第一个元素作为划分元素的缺点,即减少了遇到最坏情况的可能。

  1. #include<iostream>
  2. #include<time.h>
  3. using namespace std;
  4.  
  5. #define N 20    //  最大数组个数
  6.  
  7. #define MULTIPLIER 0x015A4E35L
  8. #define INCREMENT 1
  9.  
  10. static unsigned long seed;
  11.  
  12. /*      生成随机数种子 */
  13. void random_seed ( unsigned long d ) {
  14.         if (d== 0 ) {
  15.                 seed = time ( 0 );
  16.         } else {
  17.                 seed = d;
  18.         }
  19. }
  20.  
  21. /*      生成一个low~high范围内的随机数 */
  22. unsigned int random ( unsigned long low, unsigned long high ) {
  23.         seed = MULTIPLIER * seed + INCREMENT;
  24.         return ( (seed>> 16 )% (high-low )+low );
  25. }
  26.  
  27. /*
  28. * 按枢点元素划分序列
  29. * 输入:数组A[],序列的起始位置low,终止位置high
  30. * 输出:按枢点元素划分的序列A[],枢点元素位置i
  31. */
  32. template<class Type>
  33. int split (Type A [ ], int low, int high ) {
  34.         int k, i = low;
  35.         Type x= A [low ];
  36.         for (k = low +1; k<=high; k++ ) {
  37.                 if (A [k ]<=x ) {
  38.                         i ++;
  39.                         if (i!=k ) {
  40.                                 swap (A [i ], A [k ] );
  41.                         }
  42.                 }
  43.         }
  44.         swap (A [low ], A [i ] );
  45.         return i;
  46. }
  47.  
  48. /*
  49. * 初始化随机数并执行快排
  50. * 输入:数组A[],序列的起始位置low,终止位置high
  51. * 输出:排序好的序列A[]
  52. */
  53. template<class Type>
  54. void quicksort_random (Type A [ ], int low, int high ) {
  55.         random_seed ( 0 );
  56.         r_quicksort (A, low, high );
  57. }
  58.  
  59. /*
  60. * 随机选择枢点的快速排序
  61. * 输入:数组A[],序列的起始位置low,终止位置high
  62. * 输出:排序好的序列A[]
  63. */
  64. template<class Type>
  65. void r_quicksort (Type A [ ], int low, int high ) {
  66.         int k;
  67.         if ( low < high ) {
  68.                 k = random (low, high );
  69.                 swap (A [low ], A [k ] );
  70.                 k = split (A, low, high );
  71.                 r_quicksort (A, low, k -1 );
  72.                 r_quicksort (A, k +1, high );
  73.         }
  74. }
  75.  
  76. int main ( ) {
  77.         int A [N ];
  78.         int i, n;
  79.  
  80.         cin>>n;
  81.  
  82.         for (i= 0; i<n; i++ )cin>>A [i ];
  83.  
  84.         quicksort_random (A, 0,n -1 );
  85.  
  86.         for (i= 0; i<n -1; i++ )cout<<A [i ]<< " ";
  87.         cout<<A [n -1 ]<<endl;
  88.  
  89.         return 0;
  90. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值