一、实现思想

  1、将一个序列,等间隔地取出一个个元素,作为一个子序列  (这个步骤我称之为「拆」)

    比如  1 2 3 4 5 6 ,间隔为3

    则  1  4

          2  5

       3  6

  2、然后将各个子序列进行直接插入排序

  3、不断缩小间隔,重复以上步骤,直到间隔为1

补充:这个间隔该如何取并没有规定,但是希尔排序的创始人希尔,是取间隔d = length /2;d = d/2;直到d = 1;(length为元素个数)

 

二、实现图例

 

 

 

 

三、实现代码

  这个是在直接插入排序的基础上做了一个增强,和直接插入排序一个,要注意条件的控制

 1 #include <stdio.h>
 2 void ShellSort(int array[], int len)
 3 {
 4     int i, j;
 5     int temp;
 6 
 7     for (int d = len / 2; d >= 1; d = d / 2) //控制要拆多少次
 8     {
 9         for (i = d; i < len; i++) //一个for循环便把各个子序列进行了一遍直接插入排序,巧妙的就在于这个d
10         {
11             temp = array[i];
12             for (j = i - d; j >= 0 && temp < array[j]; j = j - d)
13                 array[j + d] = array[j];
14             array[j + d] = temp;
15         }
16     }
17 }
18 int main(void)
19 {
20     int a[] = {4, 5, 2, 3, 1, 6};
21     for (int i = 0; i < 6; i++)
22         printf("%d    ", a[i]);
23     printf("\n");
24     ShellSort(a, 6);
25     for (int i = 0; i < 6; i++)
26         printf("%d    ", a[i]);
27     return 0;
28 }
29 /* 
30 输出
31 ——————————————————————————————————
32 4    5    2    3    1    6    
33 1    2    3    4    5    6  
34 ——————————————————————————————————
35  */

(ps:我这里显示了行号,复制也会一同复制过去。你应该会竖直选择然后删除吧)

 

posted on 2020-08-03 00:36  Coderon  阅读(184)  评论(0编辑  收藏  举报