希尔排序的分析及实现

思想:先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

说明:

(1)子序列的构成不是简单地“逐段分割”,而是将相隔某个增量dk的记录组成一个子序列,让增量dk逐趟缩短(例如依次取5,3,1),直到dk=1为止。由于这个原因,希尔排序也叫缩小增量排序。

(2)优点:让关键字值小的元素能很快前移,且序列若基本有序时,再用直接插入排序处理,时间效率会高很多。

(3)希尔排序的一个重要性质是,一个h(k)排序的文件保持它的h(k)排序性,否则该算法没有任何意义,因为前面各趟排序的结果会被后面各趟排序给打乱。

(4)增量排序的一种流行(但是不好)的选择是使用Shell建议的序列:h(t)=N/2,h(k)=h(k+1)/2。

(5)时间复杂度及稳定性分析:

1)对特定的待排序对象序列,可以准确地估算关键码的比较次数和对象移动次数。但想要弄清关键码比较次数和对象移动次数与增量选择之间的依赖关系,并给出完整的数学分析,还没有人能够做到。

2)希尔排序的时间复杂度小于O(N2),大于O(NlogN)。

3)希尔排序不稳定

(6)希尔排序是算法非常简单且又具有极其复杂的分析的好例子。它的性能在实践中完全可以接受,即使是对于数以万计的N仍是如此。编程的简单特点使它成为对适度地大量的输入数据经常选用的算法。

 1 #include <stdio.h>
 2
 3 void ShellSort(int arr[], int len)
 4 {
 5     if (!arr || len == 0)
 6     {
 7         return;
 8     }
 9
10     int h, i, j, tmp;
11     for (h = len / 2; h > 0; h /= 2)
12     {
13         for (i = h; i < len; i++)
14         {
15             tmp = arr[i];
16             for (j = i; j >= h; j -= h)
17             {
18                 if (arr[j - h] > tmp)
19                 {
20                     arr[j] = arr[j - h];
21                 }
22                 else
23                 {
24                     break;
25                 }
26             }
27             arr[j] = tmp;
28         }
29     }
30     return;
31 }
32
33 int main(void)
34 {
35     int arr[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
36     ShellSort(arr, 10);
37
38     for (int i = 0; i < 10; i++)
39     {
40         printf("%d ", arr[i]);
41     }
42     printf("\n");
43
44     return 0;
45 }
时间: 2024-08-15 04:33:43

希尔排序的分析及实现的相关文章

排序算法总结之希尔排序

一,希尔排序算法介绍 ①希尔排序又称缩小增量排序 ,它本质上是一个插入排序算法.为什么呢? 因为,对于插入排序而言,插入排序是将当前待排序的元素与前面所有的元素比较,而希尔排序是将当前元素与前面增量位置上的元素进行比较,然后,再将该元素插入到合适位置.当一趟希尔排序完成后,处于增量位置上的元素是有序的. ②希尔排序算法的效率依赖于增量的选取 假设增量序列为 h(1),h(2).....h(k),其中h(1)必须为1,且h(1)<h(2)<...h(k) . 第一趟排序时在增量为h(k)的各个元

经典排序算法--希尔排序

算法简介 希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序. 白话理解: 我们依然已排队为例,加入队伍中,有一些小个子站在了队伍的后面,而一些大个子又站在了队伍的前面,这是如果再使用插入排序,那就太没有效率了.通常情况下,老师会先看一眼,然后将后面的小个子和前面的大个子互换位置.当这个队伍顺序差距不是特别明显后,再使用插入排序. 但是计算机没办法一眼看出来哪些元素差距比较大,于是我们可以每趟排序,根据对应的增量,将待排序列分割成若干长度为m

python实现希尔排序(已编程实现)

希尔排序: 观察一下"插入排序":其实不难发现她有个缺点: 如果当数据是"5, 4, 3, 2, 1"的时候,此时我们将"无序块"中的记录插入到"有序块"时,估计俺们要崩盘, 每次插入都要移动位置,此时插入排序的效率可想而知. shell根据这个弱点进行了算法改进,融入了一种叫做"缩小增量排序法"的思想,其实也蛮简单的,不过有点注意的就是: 增量不是乱取,而是有规律可循的. 希尔排序时效分析很难,关键码的比

算法之直接插入排序和希尔排序

1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止. 要点:设立哨兵,作为临时存储和判断数组边界之用. 直接插入排序示例: 如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面.所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是

插入排序—希尔排序(Shell`s Sort)原理以及Java实现

希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序. 操作方法: 选择一个增量序列t1,t2,-,tk,其中ti>tj,tk=1: 按增量序列个数k,对序列进行k 趟排序: 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序.仅增量因子为

13. 蛤蟆的数据结构进阶十三排序实现之希尔排序法

13. 蛤蟆的数据结构进阶十三排序实现之希尔排序法 本篇名言:"一个人光溜溜的到这个世界来 ,最后光溜溜的离开这个世界而去 , 彻底想起来 , 名利都是身外物 ,只有尽一人的心力 , 使社会上的人多得他工作的裨益 ,是人生最愉快的事情.--邹韬奋" 下面是希尔排序法了. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47706135 1.  希尔排序 希尔排序(ShellSort)是插入排序的一种.也称缩小增量排序

浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析(好戏在后面,有图有真相)

由于没考虑到一些情况,对以上一些算法做了改进和对比!以及昨晚把希尔排序写错而误以为其效率高过快速排序的糗事,今天一一做了更正和说明,如果你绝得本随笔不是很妥可以尝试看看这http://www.cnblogs.com/maxiaofang/p/3382927.html,有错误或不妥欢迎指正!!共同学习,共同进步!O(∩_∩)O哈哈~ 推荐一段博友分享的排序视频很艺术.很形象.很生动哦(http://www.oschina.net/question/561584_65522) 最近一段时间去武汉参加

冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析

冒泡排序 1 //冒泡排序 2 ////////////////////////////////////////////////////////////////////////// 3 void BubleSort(int a[],int n) 4 { 5 int temp; 6 bool flag=false; 7 for (int i=0;i<n;i++) 8 { 9 flag=true; 10 for (int j=0;j<n-i-1;j++) 11 { 12 if(a[j]>a[

希尔排序总结

数据结构之排序算法——希尔排序 代码很多地方借鉴了  http://my.csdn.net/MoreWindows 他的思想, 本人认为该作者已经写的很好了,只是在他的基础上加入了一些自己的理解和说明 如果涉及到版权的问题,请联系我的邮箱,我会尽快删除 希尔排序想关链接: 维基百科:https://zh.wikipedia.org/wiki/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F#C.E8.AA.9E.E8.A8.80 百度百科:http://baike.bai