【算法】希尔排序

原创 2015年11月19日 13:18:38

希尔排序

希尔排序(Shell Sort)是插入排序的一种更高效的改进版本。他是通过比较相距一定间隔的元素来工作,各趟比较所用距离随着算法的进行而减小,直至只比较相邻元素的最后一趟排序,因此也称递减增量排序算法。

直接插入排序在当序列恰好为顺序时,时间消耗为O(n),因此若某个序列已基本有序,直接插入排序的效率就会提高。

希尔排序使用一个序列h1,h2...ht的增量序列,只要h1=1,任何序列都是可行的。
选择不同的排序序列的性能不同,这里我们使用Shell建议的序列:h(t)=n/2,h(k)=h(k+1)/2

使用增量hk进行的一趟排序之后,对于∀i∈[0,n],都有a[i]<=a[i+hk],含义就是相隔hk的元素已经排好序。

希尔排序的性能

时间复杂度与增量序列有关,但复杂度小于O(n^2),同时希尔排序也是不稳定的排序算法,这是显然的,由于间隔的步长不一样,可能将某个元素插入到相同元素前面。

代码实现

按照增量dlta对数组进行排序,相隔dlta的元素已经排好序,和直接插入排序基本一样。
public void insertDlta(int[] arr, int dlta) {
	for (int i = dlta; i < arr.length; i++) {
		int key = arr[i];
		int j = i - dlta;
		while (j >= 0 && arr[j] > key) {
			arr[j + dlta] = arr[j];
			j -= dlta;
		}
		arr[j + dlta] = key;
	}
}

于是希尔排序的算法为

public void shellSort(int[] array, int reductionFactor) {
	// 当递减增量因子为2时就是采用Shell推荐的序列h(k)=h(k+1)/2
	for (int dlta = array.length / reductionFactor; dlta > 0; dlta /= reductionFactor) {
		insertDlta(array, dlta);// 对array进行增量为dlta的插入排序
	}
}

测试

public static void main(String[] args) {
	int[] array = { 49, 38, 65, 97, 76, 13, 27, 49, 55, 4 };
	shellSort(array, 2);
	for (int i : array) {
		System.out.println(i);
	}
}

输出

4 13 27 38 49 49 55 65 76 97 

算法(第四版)——04希尔排序

public class ShellSort { public static void main(String[] args) { int[] a = {45,67,43,28,90,15,77...
  • sdsxxzw
  • sdsxxzw
  • 2016年11月11日 17:16
  • 144

希尔排序算法(排序详解)

希尔排序  基本思想 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提...
  • qq845579063
  • qq845579063
  • 2016年05月18日 21:12
  • 1354

经典排序算法---希尔排序(C/C#)

原理:每隔sp(整数)个数即取数并判断大小,交换,先构造局部有序序列,直到sp为1,构造完整的有序序列。         给出一组数据,如下: 0 1 2 3 4 5 ...
  • lucky51222
  • lucky51222
  • 2014年05月18日 00:57
  • 2452

PHP实现排序算法----希尔排序(Shell Sort)

基本思想:希尔排序是指记录按下标的一定增量分组,对每一组使用 直接插入排序 ,随着增量逐渐减少,每组包含的关键字越来越多,当增量减少至 1 时,整个序列恰好被分成一组,算法便终止。操作步骤:先取一个小...
  • baidu_30000217
  • baidu_30000217
  • 2016年11月08日 19:04
  • 1173

C++、C#、java算法学习日记05----希尔排序(ShellSort)

希尔排序是插入式排序的一种,也称缩小增量排序,是对 直接插入排序  的一种更高效的改进算法, 基本思想:      希尔排序是把记录按下标的一定增量(也就是按一定的步长)分组,对每组使用直接插...
  • HC666
  • HC666
  • 2015年11月01日 18:14
  • 889

数据结构基础 希尔排序 之 算法复杂度浅析

希尔排序(Shell Sort)又叫做缩小增量排序(diminishing increment sort),是一种很优秀的排序法,算法本身不难理解,也很容易实现,而且它的速度很快。 Shell排序通过...
  • u013630349
  • u013630349
  • 2015年09月06日 21:18
  • 1504

经典算法之希尔排序(三种实现)

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直...
  • IWantToHitRen
  • IWantToHitRen
  • 2016年06月04日 10:01
  • 756

希尔排序的C++实现

感谢博主 http://www.cnblogs.com/90zeng/p/shell_sort.html 1.原理介绍 希尔排序又称为缩小增量排序,由D.L.Shell在1959年提出...
  • xinpo66
  • xinpo66
  • 2015年01月13日 12:10
  • 1896

《常见算法和数据结构》元素排序(2)——希尔排序(动画)

元素排序(2)——希尔排序 本系列文章主要介绍常用的算法和数据结构的知识,记录的是《Algorithms I/II》课程的内容,采用的是“算法(第4版)”这本红宝书作为学习教材,通过这系列文章,...
  • hk2291976
  • hk2291976
  • 2016年04月06日 22:58
  • 1193

数据结构之---C语言实现希尔排序

数据结构之---C语言实现希尔排序
  • u012965373
  • u012965373
  • 2015年09月08日 13:43
  • 5247
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【算法】希尔排序
举报原因:
原因补充:

(最多只允许输入30个字)