希尔排序法(缩小增量法)
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]复制给谁的异同了吗?
两个不一样,但是是为什么呢?
以上是关于希尔排序法(缩小增量法)的主要内容,如果未能解决你的问题,请参考以下文章