希尔排序
希尔排序
一、概念及其介绍
希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。
希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。
它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。
//缩小增量排序 //是插入排序的优化---交换法 public class ShellSort { public static void main(String[] args) { int arr[] = {8,9,1,7,2,3,5,4,6,0}; //10个数 shellSort(arr); } public static void shellSort(int arr[]){ for (int d = arr.length / 2;d>0;d /= 2){ //d:增量 5 2 1 for (int i = d; i < arr.length; i++){ // i = 6 //i:代表即将插入的元素角标,作为每一组比较数据的最后一个元素角标 //j:代表与i同一组的数组元素角标 for (int j = i-d; j>=0; j-=d){ //在此处-d 为了避免下面数组角标越界 if (arr[j] > arr[j + d]) {// j+d 代表即将插入的元素所在的角标 //符合条件,插入元素(交换位置) int temp = arr[j]; arr[j] = arr[j + d]; arr[j + d] = temp; } } } System.out.println("第"+d+"轮插入"); System.out.println(Arrays.toString(arr)); } } }
二 优化
- 一种优化方法就是使用更高性能的递增序列
- 因为是基于插入排序,所以希尔排序的优化可以借鉴简单插入排序的优化方法处理
//希尔排序的优化---移位法 public class ShellSort优化 { public static void main(String[] args) { int arr[] = {8,9,1,7,2,3,5,4,6,0}; //10个数 shellSort(arr); } public static void shellSort(int arr[]) { for (int d = arr.length / 2; d > 0; d /= 2) { //d:增量 5 2 1 for (int i = d; i < arr.length; i++) { // i = 6 int j = i; int temp = arr[j]; if (arr[j] < arr[j - d]) { while (j - d >= 0 && temp < arr[j - d]) { arr[j] = arr[j - d]; j -= d; } arr[j] = temp; } } System.out.println("第" + d + "轮插入"); System.out.println(Arrays.toString(arr)); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律