当前位置:   article > 正文

排序4:希尔排序_初始步长为4的希尔排序

初始步长为4的希尔排序

一.概述

希尔排序: 又称缩小增量排序,对一组数据按照间隔分组后,对每一组数据进行 【直接插入排序】,它也是插入排序的一种—加强版本。

 

二.算法思想

(1)间隔 Gap计算 : 设一组无序数列的长度为 len ,Gap也就是说这组数据分几组。

设gap[] = {gap1,gap2,gap….,1}

gap1 = len /2 ; 求整

gap2 = gap1 /2 ; 继续往后

要求,最有一位必须为 1

(2) 把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。

(3)随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。

(4) 设一组无序数据:9 1 2 5 7 5 8 6 3 5,进行希尔排序

Len = 10 ;

Gap 1 = 10 /2 = 5 ; 分为五组,每组两个元素之间 下标之差为 5

Gap2 = 5 / 2 = 2 余 1 (余数不用管) 分为2组,每组两个元素之间 下标之差为2

Gap3 = 2 /2 =1 ; 当模值为1,说明取到了最后一位。同上

具体过程如下所示

 

三.代码实现

 

  1. #include<stdio.h>
  2. //希尔排序
  3. //对元素进行分组 gap 间隔 数据元素/2 取整 第二次 新的元素/2 取整
  4. //每个间隔组内进行 【 直接插入排序 】
  5. void shell(int *arr,int len ,int gap)
  6. {
  7. int temp = 0;
  8. int j = 0;
  9. for(int i = gap ;i<len;++i) //相对而言每组的第一个开始
  10. {
  11. temp = arr[i];
  12. for( j =i-gap;j>=0;j=j-gap)
  13. {
  14. if(arr[j]>temp)
  15. {
  16. arr[j+gap] = arr[j];
  17. }
  18. else
  19. {
  20. break;
  21. }
  22. }
  23. arr[j+gap] = temp;
  24. }
  25. }
  26. void shellsort(int*arr,int len)
  27. {
  28. //计算好的数值放进GapArr里面,而不要用户手动输入gap每次的值
  29. int GapArr[4] = {0}; //初始化一个数组里面放每次的Gap
  30. int GapLen = 0;
  31. int num = len;
  32. for(int i = 0; i <4 ;++i)
  33. {
  34. num/=2; //gap = len /2 的 模 的值
  35. if(num !=1)
  36. {
  37. GapArr[i] = num;
  38. ++GapLen;
  39. }
  40. else
  41. {
  42. GapArr[i] = 1; //结束位为1 所以当遇到gap==1后, 设置最后一个Gap为 1length++ ; 跳出循环
  43. ++GapLen;
  44. break;
  45. }
  46. }
  47. for(int i = 0;i<GapLen;++i)
  48. {
  49. shell(arr,len,GapArr[i]);
  50. }
  51. }
  52. void show(int *arr,int len)
  53. {
  54. for(int i =0;i<len;++i)
  55. {
  56. printf("%d\t",arr[i]);
  57. }
  58. }
  59. int main()
  60. {
  61. int brr[] = {1,2,3,4,5,6,100,200,42};
  62. int len = sizeof(brr)/sizeof(brr[0]);
  63. shellsort(brr,len);
  64. show(brr,len);
  65. getchar();
  66. return 0;
  67. }

 

四.时间复杂度与空间复杂度

                                                    希尔排序相等位置可能会交换位置,因此是一种不稳定的排序方法。

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

闽ICP备14008679号