经典排序算法(十)--希尔排序Shell Sort
希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分,
第一部分,希尔排序介绍
第二部分,如何选取关键字,选取关键字是希尔排序的关键
第一块希尔排序介绍
准备待排数组[6 2 4 1 5 9]
首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组:
[6 1]一组
[2 5]二组
[4 9]三组
看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组,
就是每隔3个数取一个,每隔三个再取一个,这样取出来的数字放到一组,
把它们当成一组,但不实际分组,只是当成一组来看,所以上边的"组"实际上并不存在,只是为了说明分组关系
对以上三组分别进行插入排序变成下边这样
[1 6] [2 5] [4 9]
具体过程:
[6 1]6和1交换变成[1 6]
[2 5]2与5不动还是[2 5]
[4 9]4与9不动还是[4 9]
第一趟排序状态演示:
待排数组:[6 2 4 1 5 9]
排后数组:[1 2 4 6 5 9]
第二趟关键字取的是1,即每隔一个取一个组成新数组,实际上就是只有一组啦,隔一取一就全部取出来了嘛
此时待排数组为:[1 2 4 6 5 9]
直接对它进行插入排序
还记得插入排序怎么排不?复习一下
[1 2 4]都不用动,过程省略,到5的时候,将5取出,在前边的有序数组里找到适合它的位置插入,就是4后边,6前边
后边的也不用改,所以排序完毕
顺序输出结果:[1 2 4 5 6 9]
第二块希尔排序的关键是如何取关键字,因为其它内容与插入排序一样
那么如何选取关键字呢?就是分成三组,一组,这个分组的依据是什么呢?为什么不是二组,六组或者其它组嘞?
好的增量序列的共同特征:
① 最后一个增量必须为1
② 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况
参见 http://baike.baidu.com/view/2217047.htm
这么关键的问题竟然没有一个公式,只给出了两个判定标准
好吧,一般10个待排数字的话,关键依次选取5 3 1即可,其它的情况只能自己判断了,然后看是否符合上述两条"好"的标准
就是说,这个关键的选择是没有规定的,怎么选都可以,仅一条,关键字要越来越小,直到1为止
经典排序算法(十)--希尔排序Shell Sort相关推荐
- 经典排序算法之希尔排序
排序:希尔排序(算法) 一.简介 希尔排序(Shell Sort)是插入排序的一种算法,是对直接插入排序的一个优化,也称缩小增量排序. 希尔排序是非稳定排序算法. 希尔排序因DL.Shell于1959 ...
- JAVA排序算法之希尔排序
基本介绍 希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序法基本思 ...
- [算法]-排序算法之希尔排序
希尔排序算法思想 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序 ...
- 排序算法之希尔排序(Java实现)
希尔排序介绍 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序基本思想 ...
- php取名字算法,JavaScript排序算法之希尔排序的2个实例_基础知识
插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率. 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位. 希尔排序按其设计者希尔(Donald Shell)的 ...
- 常见排序算法之希尔排序
文章目录 1.概述 2.希尔排序之交换法 3.希尔排序之移动法 4.测试案例 1.概述 由于简单的插入排序每次数据量变多的时候,数据需要移动且交换数据的次数也会变多,继而影响效率.希尔排序就是在这个基 ...
- 排序算法:希尔排序算法实现及分析
希尔排序算法介绍 希尔排序是D.LShell 与1957年提出来的一种排序算法,在这之前排序算法的时间复杂度都是O(n^2),希尔排序算法是突破这个时间复杂度的第一批算法之一.我们知道直接插入排序算法 ...
- C/C++排序算法(2)希尔排序
常见排序算法总结(2)希尔排序 一篇文章,带你搞懂 希尔排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! (1)工作原理 希尔排序,也称递减增量排序算法,是插入排序的 ...
- 排序算法(4)希尔排序
排序算法(4)希尔排序 原理: 希尔排序也称缩小增量排序:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序, 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时(用gap ...
- 十大经典排序算法之希尔排序及其优化
一.希尔排序 1.概念 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进. 希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名. 它通过比较相距 ...
最新文章
- rand()和srand()关系很简单——一看就明白(通过一个可移植的源码)
- 海思osd+freetype+SDL+SDL_ttf编译成功后,Makefile的编写
- 《高效程序员的45个习惯》读后感
- iw linux交叉编译,iw交叉编译
- 比特位计数—leetcode338
- php结合redis实现高并发下的抢购、秒杀功能
- 【瓜分5000元奖金】Wannafly挑战赛13
- 计算机手二进制,求教高手:计算机二进制运算法则?
- 是什么还让你停留在 iOS 平台?是这些理由吗
- 充值后的充值金额提交到账户金额中
- Visual Studio 2012 Ultimate旗舰版序列号
- matlab微积分如何计算器,利用matlab进行微积分的计算.pptx
- 一些易被忽视且难度较高的Web前端面试题汇总
- 某条微博评论数据爬取
- windows_帮助文档【.CHM电子书】打开显示空白解决办法
- NO_DATA_FOUND和%NOTFOUND的区别
- 如何让DIV中的内容左边的靠左对齐,右边的靠右对齐?
- 预训练综述 Pre-trained Models for Natural Language Processing: A Survey 阅读笔记
- Spark 3.x各模式部署 - Ubuntu
- Python杂谈 | (12) OMP: Error #15: Initializing libiomp5.dylib, but found libiomp5.dylib already initia
热门文章
- java CPU 占用过高
- python S2-45 漏洞利用工具
- String s =new String()分析堆与栈
- Webservice调用方式:axis,soap详解
- P2P端口映射 UPnP功能和使用详解
- 4.Linux/Unix 系统编程手册(上) -- 文件IO:通用的IO模型
- 15. Magento路由分发过程解析(四):请求重写
- 大气辐射示意简单图_地理笔记 | N21 自然地理——大气的组成与垂直分层
- Mybatis-generator的使用
- PADS 管脚编号全部修改方式