插入排序之希尔排序
2015-10-08 20:06
260 查看
插入排序之希尔排序
希尔排序的基本思想是分组的直接插入排序。由直接插入排序可知,若序列越接近有序,时间效率越高;再者,当n较小时,时间效率也较高。希尔排序正是基于这两点对直接插入排序算法进行改进。
算法描述:(1)分组,将序列分成若干组,每组由相隔一定增量的元素组成,在一个组内采用直接插入排序进行排序。(2)增量,初值是长度的一半,以后每趟增量减半,直至为1。增量减少,从而组数也减少,但组内元素增多,数据序列逐渐有序。
序列{38,55,65,97,27,76,27,13,19}的希尔排序刚才如下图所示:
希尔排序算法代码如下:
希尔排序算法增量的变化规律有多种方案。上述减半是一种方案,一旦确定增量的变化规律,则一个数据序列的排序趟数也就确定了。
在希尔排序中,相等的两个数有可能不在同一组中,所以两个数会错过比较,那么希尔排序算法就是不稳定的。
希尔排序算法时间复杂度是O(nx(log2n)2),空间复杂度O(1),不是稳定的排序。
希尔排序的基本思想是分组的直接插入排序。由直接插入排序可知,若序列越接近有序,时间效率越高;再者,当n较小时,时间效率也较高。希尔排序正是基于这两点对直接插入排序算法进行改进。
算法描述:(1)分组,将序列分成若干组,每组由相隔一定增量的元素组成,在一个组内采用直接插入排序进行排序。(2)增量,初值是长度的一半,以后每趟增量减半,直至为1。增量减少,从而组数也减少,但组内元素增多,数据序列逐渐有序。
序列{38,55,65,97,27,76,27,13,19}的希尔排序刚才如下图所示:
希尔排序算法代码如下:
public class ShellSort { public static void shellSort(int[] keys) { for (int delta = keys.length / 2; delta > 0; delta /= 2) {// 控制趟数,每趟增量减半 for (int i = delta; i < keys.length; i++) {// 每组进行插入排序 int temp = keys[i]; int j; for (j = i - delta; j >= 0 && temp < keys[j]; j -= delta) {// 找到插入位置 keys[j + delta] = keys[j]; } keys[j + delta] = temp;//插入数据 } } } public static void main(String[] args) { Scanner s = new Scanner(System.in); int[] n = new int[10]; for (int i = 0; i < n.length; i++) { n[i] = s.nextInt(); } shellSort(n);//调用希尔排序算法 for (int i = 0; i < n.length; i++) { System.out.print(n[i] + " "); } } }
希尔排序算法增量的变化规律有多种方案。上述减半是一种方案,一旦确定增量的变化规律,则一个数据序列的排序趟数也就确定了。
在希尔排序中,相等的两个数有可能不在同一组中,所以两个数会错过比较,那么希尔排序算法就是不稳定的。
希尔排序算法时间复杂度是O(nx(log2n)2),空间复杂度O(1),不是稳定的排序。
相关文章推荐
- auto_ptr浅析 http://www.cnblogs.com/qytan36/archive/2010/06/28/1766555.html
- poj 2018 斜率优化(最大平均值问题)
- 区间集的覆盖长度
- 2015国庆总结
- [数据挖掘课程笔记]SLIQ算法
- 判断一棵二叉树是否平衡二叉树
- C++复习:位运算
- 高并发网站架构设计方案
- 【leetcode】79. Word Search
- Dialog中有EditText无法弹出输入法解决方法
- 数据结构实验之栈六:下一较大值(二)【OJ-3333】【自己写的封装的栈代码】
- 自居电路(升压电路)
- 关于AlertDialog的常见用法
- 海量数据处理分析
- 编辑并保存手机中的图片至本地
- Linux CP文件夹略过目录的解决
- leecode algo4: Median of Two Sorted Arrays (Java)
- 什么是Kivy???
- Windows Azure Virtual Machine (26) 使用高级存储和DS系列VM
- 在service中播放音乐