希尔排序算法解析
Posted 地中海程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了希尔排序算法解析相关的知识,希望对你有一定的参考价值。
希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止(摘自百度百科)。
简单点理解:就是先将要排序的数据分组,然后对每组数据做插入排序。
public static void desc(int nums[]) {
//确定增量
int h = nums.length;
while (h >= 1) {
h = h / 2;
for (int i = h; i < nums.length; i ++) {
for (int j = i; j >= h; j -= h) {
if (nums[j] > nums[j - h]) {
int temp = nums[j];
nums[j] = nums[j - h];
nums[j - h] = temp;
} else {
break;
}
}
}
}
}
❖ 希尔排序代码图
原数组:
[2, 4, 5, 1, 3, 6, 7, 9, 8, 0]
第一次排序,h=5,因此第一组数据为下标为0和5的数据。即2和6一组,做插入排序,6和2交换位置,同理,7和4,9和5,8和1也交换位置。
[6, 7, 9, 8, 3, 2, 4, 5, 1, 0]
第二次排序,h=2
[9, 8, 6, 7, 4, 5, 3, 2, 1, 0]
第三次排序h=1
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
❖ 排序过程图
希尔排序的时间的时间复杂度为O(n^(3/2)),希尔排序时间复杂度的下界是n*log2n,
Shell算法的性能与所选取的分组长度序列有很大关系。只对特定的待排序记录序列,可以准确地估算关键词的比较次数和对象移动次数。想要弄清关键词比较次数和记录移动次数与增量选择之间的关系,并给出完整的数学分析,今仍然是数学难题.(摘自百度百科),
准备了10万个数据,顺序排列,现用插入排序和希尔排序分别将它变成倒序的。
int nums[] = new int[100000];
for (int i = 0; i < 100000; i++) {
nums[i]=i;
}
最终得出时间:
插入排序时间:2719毫秒
希尔排序时间:5毫秒
可以看到在10万条数据排序的时候,希尔排序的效率远远高于插入排序。
感谢各位的阅读,如有问题,欢迎大家留言反馈,我会在第一时间修正。
如果觉得文章还可以的话,不妨点个关注吧!!!
以上是关于希尔排序算法解析的主要内容,如果未能解决你的问题,请参考以下文章
七大排序算法(插排,希尔,选择排序,堆排,冒泡,快排,归并)--图文详解