希尔排序法(缩小增量法)

Posted 菜鸟根据地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了希尔排序法(缩小增量法)相关的知识,希望对你有一定的参考价值。

2016-10-25 16:51:49

      首先,要明白希尔排序法是什么。它是一种改进版的直接插入法,它是将整个无序列分割成若干小的子序列分别进行插入排序的方法。

 1 #include<stdio.h>
 2 
 3 //希尔排序法
 4 void shell_sort(int a[],int n);
 5 int main()
 6 {
 7     int i;
 8     int a[6];
 9     printf("please enter five numbers:\n");
10     for(i=1;i<6;i++)
11     {
12         scanf("%d",&a[i]);
13     }
14     shell_sort(a,5);
15     printf("after number:\n");
16     for(i=1;i<6;i++)
17     {
18         printf("%4d",a[i]);
19     }
20     printf("\n");
21 }
22 
23 void shell_sort(int a[],int n)
24 {
25     int i,j;
26     int d;
27     d=n/2;
28     while(d)
29     {
30         for(i=d+1;i<=n;i++)
31         {
32             a[0]=a[i];
33             j=i-d;
34             while(a[0]>=a[j]  && j>0)
35             {
36                 a[j+d]=a[j];
37                 j=j-d;
38             }
39             a[j+d]=a[0];
40         }
41         d=d/2;
42     }
43 }

 

这就和直接插入法非常类似了。因此其也有另一种形式。

 1 #include<stdio.h>
 2 
 3 //希尔排序法
 4 void shell_sort(int a[],int n);
 5 int main()
 6 {
 7     int i;
 8     int a[6];
 9     printf("please enter five numbers:\n");
10     for(i=1;i<6;i++)
11     {
12         scanf("%d",&a[i]);
13     }
14     shell_sort(a,5);
15     printf("after number:\n");
16     for(i=1;i<6;i++)
17     {
18         printf("%4d",a[i]);
19     }
20     printf("\n");
21 }
22 
23 void shell_sort(int a[],int n)
24 {
25     int i;
26     int d;
27     d=n/2;
28     while(d)
29     {
30         for(i=d+1;i<=n;i++)
31         {
32             a[0]=a[i];
33             
34             while(a[0]>=a[i-d]  && i>d)
35             {
36                 a[i]=a[i-d];
37                 i=i-d;
38             }
39             a[i]=a[0];
40         }
41         d=d/2;
42     }
43 }

发现两次while循环后,a[0]复制给谁的异同了吗?

两个不一样,但是是为什么呢?

 

以上是关于希尔排序法(缩小增量法)的主要内容,如果未能解决你的问题,请参考以下文章

希尔排序

SuperHakce 算法实践之希尔排序

希尔排序 转载

算法希尔排序 推导方法

数据结构-排序-希尔排序

希尔排序算法