经典排序之希尔排序

简介:
复制代码
 1 #include <stdio.h>
 3 void shell_order(int *a,int length)
 4 {
 5     int increment,i,j,tem;
 6     for(increment = length/2; increment > 0; increment /=2)
 7     {
 8         for(i = increment; i < length; i++)
 9         {
10             tem = a[i];
11             for(j = i; j >= increment; j -= increment)
12             {
13                 if(tem<a[j-increment])
14                 a[j] = a[j-increment];
15                 else break;
16             }
17             a[j] = tem;
18         }
19     }
20 }
21 
22 int main()
23 {
24     int a[] = {6,5,1,7,2,4,3};
25     int length = sizeof(a)/sizeof(int);
26     int i;
27     shell_order(a,length);
28     for(i = 0; i < length; i++)        
29     printf("%d ",a[i]);
30     printf("\n");
31     return 0;
32 }

本例代码关于希尔排序的实现:首先选取一个增量的选取方法,然后按照增量的选取规则,每次循环的对数据按照增量的间隔进行插入排序式的排序,其本质就是对独立子数组进行插入排序。

希尔排序:希尔排序的运行时间主要依赖于增量序列的选取,以上例子代码中使用的增量是Shell建议的 h1 = [Length/2]; h2 = [h1/2] ....但是这个增量的选取并不好,而且效率最坏的情况为O(n^2);下边列举一种增量的选取:
(1) Hibbard的增量选取法:1、3、7 ... 2^k-1...;因为这种增量的选取方法,没有公因子,据证明效率为O(N^(3/2));但是也有说经过大量的运行这种增量选取的效率为O(N^(5/4));但都比shell增量效率要高;
(2)Sedgewick提出的另一种增量选取:9*4^i-9*2^i + 1或是4^i - 3*4^i + 1;通过这两种选取增量的方法可以实现shell排序平均效率猜想为O(N^(7/6)),已经比Hibbard 的方法效率高了。

关于希尔排序:希尔排序的性能在实践中是完全可以接受的,即使对于数以万计的N仍然是这样,由于编程简单的特点,使得shell排序对应大量的数据输入的常用算法。


复制代码
本文转自NewPanderKing51CTO博客,原文链接: http://www.cnblogs.com/newpanderking/archive/2012/05/18/2507981.html  ,如需转载请自行联系原作者
相关文章
【经典排序】插入与希尔排序
【经典排序】插入与希尔排序
69 0
|
移动开发 算法 Shell
算法之排序5——希尔排序
依次比较待插入元素 i 和分组内另一个元素,就需要用到for循环语句;当h = 5 时,a[5]恰好是数组内第6个元素,也就是第一个待插入的元素,所以初始条件是 i = h,待插入的最后一个元素就是数组内最后一个元素,即终止条件为 i < a.length
129 0
算法之排序5——希尔排序
|
算法 API
算法排序4——插入排序
每个元素要比较的是它之前的已排序的元素,并判断大小,所以再定义一个元素 j,从已排序组内从后往前比较;例如当 i = 5 的时候,其实是第6个位置,而 j = 5 的时候,由于从第一个开始计数,所以就表示第五个位置,恰好满足已排序组内的最后一个,终止值就是元素第一个
94 0
算法排序4——插入排序
|
算法 搜索推荐 Java
排序:希尔排序(算法)
(注:如果想更好的理解希尔排序,请先看看我的上一篇博客插入排序,希望会对你有帮助。)
324 0
排序:希尔排序(算法)
|
算法 搜索推荐 Java
排序:插入排序(算法)
排序:插入排序(算法)
210 0
排序:插入排序(算法)
|
搜索推荐 算法 Java
排序:冒泡排序(算法)
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
273 0
排序:冒泡排序(算法)
|
机器学习/深度学习 人工智能
|
机器学习/深度学习 人工智能