算法自学笔记:希尔排序

2021/9/20 17:27:16

本文主要是介绍算法自学笔记:希尔排序,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

希尔排序可以理解为插入排序的升级版。在插入排序中,如果发现位置靠后的元素比位置靠前的元素小,会一个个比较元素直到移到正确位置,这一做法会带来频繁比较和交换操作,因而效率低。而希尔排序一次比较跨度大于1,排序一轮后减小比较的跨度,直到等于1.这么做可以使最后一轮插入排序时数组已经基本上排列有序,减少频繁交换。

对于按照跨度大小A排序后的数组,再按照跨度B排序时,原来按跨度A交换的各元素位置不会改变(证明很困难,就当定理即可)

希尔排序选取合适的区间跨度很重要,一个常用的方法是选取3n + 1作为增幅,还有一个更快的方法是Sedgewick数列:1 5 19 41 109 209 505 929 2161 3905…… ,但是该方法程序实现较难,而且样本较小时加速不明显。

希尔排序的性能至今未解,不过可以确定对于中等大小的数组希尔排序效率较高,而且希尔排序代码简单,是性能不错的排序算法。

实例代码:

	public static void sort (Comparable[] a) {
		int h = 1;
		// find the largest h for the input
		while (h < a.length / 3) {
			h = h * 3 + 1;
		}
		
		
		while (h >= 1) {
			// same process as insertion sort
			for (int i = h; i < a.length; i++) {
				for (int j = i; j >= h; j -= h) {
					if (less(a[j], a[j - h])) {
						exch(a, j, j - h);
					} else {
						break;
					}
				}
			}
			// decrease h
			h /= 3;
		}
	}

如程序所示,首先使用一个while循环找到初始最大h值,然后的排序操作和插入排序完全一致,除了把j变量变动幅度由1改为h,然后h除以3,以较小幅度进行下一轮排序,直到h为1,最后一轮插入排序。



这篇关于算法自学笔记:希尔排序的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程