数据结构与算法之希尔排序
希尔排序是插入排序的优化版本.插入排序的思路是每次跟前一个比较,需要交换则交换,然后指针向后移动,再次与前面的比较,如果不需要交换则表示前边的前边也不需要交换.
希尔排序则是通过添加一个步长的概念,每次把当前元素与增加步长后的元素比较,如果交换则交换.然后再次增加步长去比较,这个过程与插入排序一样.希尔排序与插入排序的
区别在于希尔排序通过步长将数组划分为子数组,将子数组通过插入排序.而步长也要不断的递减,直到步长是1此时就退化为插入排序.
这个算法最好情况下时间复杂度:O(n)平均情况下时间复杂度:O((nlog(n))^2)
public static void xier(int[] arr) {
int gap = arr.length;
while ((gap = gap / 2) > 0) {
for (int i = gap; i < arr.length; i++) {
for (int j = i; j >= gap; j -= gap) {
if (arr[j] < arr[j - gap]) {
int temp = arr[j];
arr[j] = arr[j - gap];
arr[j - gap] = temp;
} else {
break;
}
}
}
}
}
以下代码提供一个测试方法.
public static void main(String[] args) {
Random random = new Random();
while (true) {
int length = random.nextInt(100);int[] arr = new int[length];
int[] arr2 = new int[length];
for (int x = 0; x < length; x++) {
int i = random.nextInt(100);
arr[x] = i;
arr2[x] = i;
}
xier(arr);
Arrays.sort(arr2);
boolean equals = Arrays.equals(arr2, arr);
System.out.println(equals);
if (!equals) {
break;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!