算法自学笔记:希尔排序
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,最后一轮插入排序。
这篇关于算法自学笔记:希尔排序的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南