`
xuela_net
  • 浏览: 494255 次
文章分类
社区版块
存档分类
最新评论

数据结构排序系列详解之二 希尔排序

 
阅读更多

接着上一篇博客,这篇要介绍的是希尔排序(缩小增量排序法)。

希尔排序:通过比较相距一定间隔的元素来工作;各趟比较所用的距离(增量)随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。是插入排序的一种,是针对直接插入排序算法的改进。

算法思想:先将要排序的序列按某个增量d分成若干个子序列,对每个子序列中全部元素分别进行直接插入排序,然后再用一个较小的增量对它进行分组,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。注意:增量的取值——一般的初次取序列的一半为增量,以后每次减半,直到增量为1。

算法实现代码如下:

package exp_sort;

public class ShellSort {

	public static void shell(int array[]) {
		int j;
		int average;
		//设置增量的值
		for (average = array.length / 2; average > 0; average /= 2) {  //步长
			for (int i = average; i < array.length; i++) { //子序列进行直接插入排序
				int temp = array[i];
				for (j = i; j >= average && temp < array[j - average]; j -= average) {
					array[j] = array[j - average];
				}
				array[j] = temp;
			}
		}
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + " ");
		}
		System.out.println("\n");

	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int array[] = { 38, 62, 35, 77, 55, 14, 35, 98 };
		shell(array);
	}

}

算法分析:该算法是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比O(n^2)好一些,为O(n^1.5),排序效率比插入排序高很多。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。希尔排序没有快速排序算法快 O(N*(logN)),因此对中等大小规模的数据排序比较适用,对规模非常大的数据排序不是最优选择。但是比O(N^2)复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。

分享到:
评论

相关推荐

    python数据结构与算法详解与源码

    数据结构与算法(Python) 一、引入概念 1-01算法引入 1-02 时间复杂度与大O表示法 1-03-最坏时间复杂度与计算规则 1-04-常见时间复杂度与大小关系 1-05-代码执行时间测量模块 1-06-Python列表类型不同操作的...

    排序-详解-数据结构

    主要知识点 插入排序 直接插入排序 O(n2) 希尔排序 O(n(lbn)2) 选择排序 直接选择排序O(n2) 堆排序O(nlbn) 交换排序 冒泡排序O(n2) 快速排序O(nlbn) 二路归并排序O(nlbn) 基数排序O(mn)

    java数据结构与算法之希尔排序详解

    主要介绍了java数据结构与算法之希尔排序,结合实例形式分析了希尔排序的概念、原理、实现方法与相关注意事项,需要的朋友可以参考下

    考研-数据结构-殷人昆.zip

    8.2.3 希尔排序 238 8.3 交换类排序 240 8.3.1 起泡排序 240 8.3.2 快速排序 241 8.4 选择类排序 243 8.4.1 简单选择排序 243 8.4.2 堆排序 244 8.5 二路归并排序 247 8.6 基数排序 248 8.7 外部排序 252 8.7.1 概念...

    十大基本排序

    数据结构十大排序详解,插入,希尔,冒泡,快速,选择,堆,归并,桶,基数,二分十个排序的应用

    JS中的算法与数据结构之常见排序(Sort)算法详解

    主要介绍了JS中的算法与数据结构之常见排序(Sort)算法,结合实例形式详细分析了js常见排序算法中的冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序等算法相关实现技巧与操作注意事项,需要的朋友可以...

    c语言例程大全,帮你学习c编程

    * 数据结构中的所有排序算法(冒泡排序,堆排序,直接插入排序,二路归并排序,快速排序,基数排序,直接选择排序,希尔排序)的例子; * 丰富的数组,位,指针,枚举,结构体,联合体等操作的例子; * 一个...

    C语言例程库(CLEL_v2.2)

    * 数据结构中的所有排序算法(冒泡排序,堆排序,直接插入排序,二路归并排序,快速排序,基数排序,直接选择排序,希尔排序)的例子; * 丰富的数组,位,指针,枚举,结构体,联合体等操作的例子; * 一个...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料;本资料仅用于学习。 【课程内容】 第1周 开课介绍 python发展介绍 第一个python程序 变量 字符编码与二进制 字符编码的区别与介绍 ...数据结构其他

    LeetCodeLearning:这个仓库主要用于每天一题,大家的自发刷题,大家可以自由的提交和修改

    高度自律多刷题基本数据结构和算法 (后续我会每天找时间补充)链表链表双向链表哈希表/散列表 (Hash Table)散列函数碰撞解决排序算法冒泡排序插入排序选择排序希尔排序快排归并排序堆排序查找算法有序表查找:二分...

    C程序范例宝典(基础代码详解)

    实例129 希尔排序 193 实例130 起泡排序 194 实例131 快速排序 195 实例132 选择排序 197 实例133 归并排序 198 4.3 查找算法 199 实例134 顺序查找 199 实例135 二分查找 201 实例136 分块查找 ...

Global site tag (gtag.js) - Google Analytics