Java希尔排序
Java希尔排序
/**
* 希尔排序
*
* @author yl
*/
public class ShellSort {
public static void main(String[] args) {
int[] array = {7, 6, 9, 3, 1, 5, 2, 4};
System.out.println(Arrays.toString(shellSort(array)));
}
/**
* 希尔排序算法
* 希尔排序是插入排序的一种,又称缩小增量排序,它是针对直接插入排序算法的改进,因 DL.Shell 于 1959 年提出而得名。
* 希尔排序是非稳定排序算法,它通过比较相距指定步长的元素来进行排序,每趟比较的步长随着算法的进行而减小,直到步长等于1的最后一趟排序结束。
* 希尔排序是基于插入排序的以下两点性质而提出改进方法的:
* 1、插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
* 2、但插入排序一般来说是低效的,因为插入排序每次只能将数据移动1
* 希尔排序是先将整个待排序的序列分组排序(两两一组),待整个序列中基本有序时,再对全体记录进行依次直接插入排序。
*
* @param array
* @return
*/
public static int[] shellSort(int[] array) {
// 步长可以自己定义,一般指定为数组长度的一半
for (int i = array.length / 2; i > 0; i = i / 2) {
// 从下标等于步长的位置开始排序
for (int j = i; j < array.length; j++) {
// 如果后面的数比前面的数小,则交换位置
while (j - i >= 0 && array[j] < array[j - i]) {
int temp = array[j];
array[j] = array[j - i];
array[j - i] = temp;
// 注意,交换完位置后,还要比较交换完位置的array[j]是否比相距指定步长的array[j-i]小,如果是,则继续交换位置。
// 基于这个原因,不能使用if来判断,否则只能交换一次位置
j = j - i;
}
}
}
return array;
}
}
记得快乐
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!