排序算法-希尔排序(Java)
程序员文章站
2024-03-16 10:49:22
...
希尔排序
希尔排序也是一种插入排序,是插入排序的更高效率的版本,也称为缩小增量排序
希尔排序的思想:
- 把记录按照下标的一定增量分组
- 对每组使用直接插入排序算法排序
- 随着增量逐渐减少,每组包含的关键词越来越多
- 当增量减至1时,整个恰好分成一组,算法终止,排序完成
希尔排序示意图:
最后直接进行微调即可,避免了像简单插入排序那样,当需要插入的数较小时,后移的次数明显增多,从而对效率有不好的影响
接下来列举两种实现方式:
- 替换法
- 移位法
public static void shellSort(int [] arr){
int temp = 0;//临时变量
//gap表示步长,实现分组递减
for(int gap = arr.length / 2;gap > 0; gap /= 2){
for(int i = gap;i < arr.length;i++){//从步长开始依次递增
//从头开始依次循环往回进行循环比较,使同一组内的数据保持按照顺序递增
for(int j = i - gap;j >= 0;j -= gap){
if(arr[j] > arr[j + gap]){
temp = arr[j];
arr[j] = arr[j + gap];
arr[j + gap] = temp;
}
}
}
}
}
public static void shellSort(int [] arr){
for(int gap = arr.length / 2;gap > 0;gap /= 2){
for(int i = gap;i < arr.length;i++){//和上面原理一样
int j = i;
int temp = arr[i];//临时变量
if(arr[j] < arr[j -gap]){//判断大小是否需要移位操作
while(j - gap >= 0 && arr[j] < arr[j - gap]){//如果前面比后面元素大,则进行移位操作
arr[j] = arr[j - gap];
j -= gap;
}
//当while循环结束后需要将临时变量元素插入到相对位置上
//因为上面的移位只是将 大的元素放到了后面,而小的元素还没换到前面
//这里就是将小元素放到前面,为什么给arr[j]赋值,因为上面循环最后执行了 j = j-gap
//已经指向了前面位置
arr[j] = temp;
}
}
}
}
上一篇: 旷视face++,图像识别
下一篇: 排序算法-选择排序(java)
推荐阅读
-
【Java学习笔记】排序算法:冒泡排序、快速排序、选择排序、插入排序算法思想及其Java代码实现
-
(个人算法笔记)排序算法之冒泡排序
-
Java 排序算法 — 冒泡排序
-
排序算法-希尔排序(Java)
-
Java 排序算法 — 希尔排序
-
排序算法-选择排序(java)
-
查找排序的简单算法
-
【算法】给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序
-
LeetCode算法题解:一个无序数组排序后的任意两个相邻元素的最大差值
-
数据结构二分法-给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。