Liny_@NotePad

沉迷ACG中

随机的快速排序算法

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

  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. }