当前位置:   article > 正文

难以想象的排序效率:希尔排序和插入排序的比较_千万数量希尔排序和插入排序 效率差多少?

千万数量希尔排序和插入排序 效率差多少?

            最开始学习排序是冒泡排序,那时候以为排序总不过就是两两比较,然后交换值而已:今天突然想实现一线以前所有学过的排序算法,对10w级别以上的数组进行排序的时候,希尔排序和插入排序的效率简直不在一个数量级上的。

           现在还有一个疑虑就是希尔排序的增量的确定的问题,我的方法是一个固定的增量区间,对排序的数组的元素个数 all = (int)log(size*4) + 1; //增量的个数是排序数数量级的ln,这样得到的增量数组

 

 对18W个数字排序,时间比较(毫秒) 希尔排序 0.1s 就完成了,有点不敢相信,插入排序用了4.2s

  1. #include <iostream.h>
  2. #include <windows.h>
  3. #include <ctime>
  4. #include <math.h>
  5. #include <cstdlib>
  6. void insertSort( int a[],int size);
  7. //随机产生size个数组,存到pint里面
  8. int randArr(int * pint , int size);
  9. void ShellInsert(int a[],int size,int dk);
  10. void ShellSort(int a[],int size,int dlta[],int t);
  11. //得到增量值
  12. int GenDis(int a[],int size);
  13. void main()
  14. {
  15. int t = 0;
  16. int i =0,start=0,tsize=0;
  17. int dis[20] ={0};
  18. tsize = 188880;
  19. cout<<"产生随机数"<<tsize<<"个"<<endl;
  20. t = GenDis(dis,tsize);
  21. cout<<"产生区间间隔距离"<<t<<"个:如下"<<endl;
  22. for( i = 0 ; i < t ; i++)
  23. {
  24. cout<<dis[i]<<" ";
  25. }cout<<"\n";
  26. int *pint=new int[tsize];
  27. int *pint2 =new int[tsize];
  28. if(! randArr(pint,tsize) )
  29. return;
  30. memcpy(pint2,pint,sizeof(int) * tsize);
  31. start = GetTickCount();
  32. ShellSort(pint,tsize,dis,t );
  33. cout<<"time ShellSort used="<< GetTickCount() - start << endl;
  34. for( i = 0 ; i < t ; i++)
  35. {
  36. cout<<pint[i]<<" ";
  37. }cout<<"=========\n";
  38. /*插入排序的时间效率*/
  39. start = GetTickCount();
  40. insertSort(pint2,tsize);
  41. cout<<"time insertSort used="<< GetTickCount() - start << endl;
  42. for( i = 0 ; i < t ; i++)
  43. {
  44. cout<<pint2[i]<<" ";
  45. }cout<<"=========\n";
  46. delete[] pint;
  47. delete[] pint2;
  48. }
  49. int GenDis(int a[],int size)
  50. {
  51. int dlta []= {1500,1340,1160,1050,800,760,560,370,168,100,65,40,25,10,5,2,1};/*17个*/
  52. int all = (int)log(size*4) + 1; //增量的个数是排序数组数量级的ln
  53. int i = 0 , j = 0;
  54. if( all >= sizeof(dlta) /sizeof(dlta[0]))
  55. {
  56. all = sizeof(dlta) /sizeof(dlta[0]);
  57. i = 0;
  58. }
  59. else
  60. i = sizeof(dlta) /sizeof(dlta[0]) - all;
  61. for( j = 0 ; i < sizeof(dlta) /sizeof(dlta[0]) ; i++,j++)
  62. {
  63. a[j] =dlta[i];
  64. }
  65. return all;
  66. }
  67. void insertSort( int a[],int size)
  68. {
  69. int i ,j;
  70. int pos;
  71. for( i = 1 ; i < size ; i++)
  72. {
  73. for(pos = a[i] ,j = i-1 ; j >= 0 && a[j] > pos ; j--)
  74. {
  75. a[j+1] = a[j];
  76. }
  77. a[j+1] = pos;
  78. }
  79. }
  80. //产生size个随机数
  81. int randArr(int * pint , int size)
  82. {
  83. int i = 0;
  84. if(!pint) return 0;
  85. srand((unsigned int)time(NULL));
  86. for( i = 0 ; i<size; i++)
  87. {
  88. pint[i] = rand() ;
  89. if( rand() % 10 == 1 && rand() % 10 == 1 && rand() % 10 == 1 &&pint[i] % 10 == 2)
  90. pint[i] *= -1;
  91. }
  92. return 1;
  93. }
  94. void ShellInsert(int a[],int size,int dk)
  95. {
  96. int i= 0,j = 0 , pos;
  97. for(i = dk; i < size ; i++)
  98. {
  99. if(a[i] < a[i-dk])
  100. {
  101. pos = a[i];
  102. for( j = i -dk; j>=0 && pos < a[j] ;j -= dk)
  103. {
  104. a[j + dk] = a[j];
  105. }
  106. a[j+dk] = pos;
  107. }
  108. }
  109. }
  110. void ShellSort(int a[],int size,int dt[],int t)
  111. {
  112. for(int k = 0; k < t ; k++)
  113. {
  114. ShellInsert(a,size,dt[k]);
  115. }
  116. }


 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/885965
推荐阅读
相关标签
  

闽ICP备14008679号