希尔排序(插排plus)

news/2025/2/3 9:00:29/

希尔排序(插排plus)

对数据进行分组 想出这个算法的人,这到底是什么脑子啊!这种设计的思路,真的是夺天地之造化,巧夺天工啊

搞不清怎么玩的,千万不要摁看,去debug自己调一调就明白了

package com.ywystu.SortType;import java.util.Arrays;/*** @author 是狸猫啊!* @Version 1.0* 希尔排序交换法和移动法,很显然移动法的效率更高一点*/
public class ShellSort {public static void main(String[] args) {int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
//        shellSort(arr);ShellSort(arr);System.out.println(Arrays.toString(arr));}//使用逐步推导的方式public static void shellSort01(int[] arr) {//因为是第一轮排序 所以将数据分为5组for (int i = 5; i < arr.length; i++) {//这里就是从数组的第一个元素进行的  步长为5  这里的j必须大于0 要不第一组的排序是算不进去的j一开始就是0for (int j = i - 5; j >= 0; j -= 5) {if (arr[j] > arr[j + 5]) {int temp = arr[j];arr[j] = arr[j + 5];arr[j + 5] = temp;}}}System.out.println("希尔排序后的结果");System.out.println(Arrays.toString(arr));//这是第二次排序后的结果for (int i = 2; i < arr.length; i++) {//这里就是从数组的第一个元素进行的  步长为5  这里的j必须大于0 要不第一组的排序是算不进去的j一开始就是0for (int j = i - 2; j >= 0; j -= 2) {if (arr[j] > arr[j + 2]) {int temp = arr[j];arr[j] = arr[j + 2];arr[j + 2] = temp;}}}System.out.println("希尔排序后的结果");System.out.println(Arrays.toString(arr));//这里是第三次的排序//这是第二次排序后的结果for (int i = 1; i < arr.length; i++) {//这里就是从数组的第一个元素进行的  步长为5  这里的j必须大于0 要不第一组的排序是算不进去的j一开始就是0for (int j = i - 1; j >= 0; j -= 1) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}System.out.println("希尔排序后的结果");System.out.println(Arrays.toString(arr));}//用交换法进行排序public static void shellSort(int[] arr) {int temp = 0;int count = 0;for (int gap = arr.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < arr.length; i++) {//这里就是从数组的第一个元素进行的  步长为5  这里的j必须大于0 要不第一组的排序是算不进去的j一开始就是0for (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;}}}System.out.println("希尔排序"+(++count) +"的结果:");System.out.println(Arrays.toString(arr));}}//用移动法进行解释/*** 第一次跑gap是5,首先的一个数值是arr[5] 也就是第六个数 和arr[0]进行比较 然后交换**/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[j];if (arr[j] < arr[j - gap]){while(j - gap >= 0 && temp < arr[j -gap]){arr[j] = arr[j -gap];j -= gap;}arr[j] = temp;}}}}
}

**交换法的劣势:**每次步子确定之后,就需要和隔着步子前面的数进行比较

第一次跑gap是5,首先的一个数值是arr[5] 也就是第六个数 和arr[0]进行比较 然后交换,当间隙变了的时候又会成为一个新的序列,可能长度变化就会很大,继续在while中寻找插入的位置


http://www.ppmy.cn/news/207791.html

相关文章

插排 选排 冒泡 快排

这里浅显的介绍下8大排序中的四个 这四个是我个人认为稍微简单的 如果想看详细解释请出门搜索有大牛 1.插排 时间复杂度&#xff1a;O(n^2) 空间复杂度&#xff1a;O(1) 稳定性&#xff1a;稳定 上代码 2.选排 时间复杂度&#xff1a;O(n^2) 空间复杂度&#xff1a;O(1) 稳定性…

电源插排的接线

前言 去现场&#xff0c;缺个电源插排接笔记本。买了一个&#xff0c;同事会弄强电&#xff0c;将3相插头剪了&#xff0c;直接接在配电箱里面。 干完活了&#xff0c;我将插排拆下来&#xff0c;拿回家。 正好以前买开关电源时&#xff0c;也买了3相的插头。准备接好&#xf…

前端基本算法——冒泡、插排、快排

冒泡排序 它重复地走访过要排序的元素列&#xff0c;依次比较两个相邻的元素&#xff0c;如果顺序&#xff08;如从大到小、首字母从Z到A&#xff09;错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换&#xff0c;也就是说该元素列已经排序完成。 基…

插排之希尔排序算法

步骤 将数据分成d n//2 组&#xff0c;每一趟希尔排序从元素d开始&#xff0c;采用直接插排。 每个元素的比较和插入均在同一组内进行。 更新d d//2 。 直到d0时停止&#xff0c;当d1时&#xff0c;相当于对近乎有序的结果进行一次完整的直接插排。 ​ 图解 图片来源 …

做一个“有思想的插排”--联网模块选型

前言 最近手里没事&#xff0c;加上esp8266模块买来好长时间&#xff0c;还没有做过东西&#xff0c;只是拿来进行实验了。最近想做一个联网控制设备&#xff0c;就瞄上了插排&#xff0c;方便&#xff0c;简单&#xff0c;快捷&#xff0c;使用。 祝我好运&#xff01;&…

接口与插排之关系

今天有人问我接口的意义&#xff0c;其实接口的意义很明确&#xff0c;主要是为了增强扩展性和修改性&#xff0c;降低耦合度&#xff0c;一旦需求发生变化&#xff0c;只需要修改一次。而且接口也是对类之间关系的一个有益的补充&#xff0c;可以进一步实现多态。并且&#xf…

【数据结构·考研】链表插排

题目&#xff1a; 对带头结点的单链表 Head 进行插入排序&#xff0c;排序后结点值从小到大排序。 思路&#xff1a;链表不同于顺序表&#xff0c;不能实现从待排序结点从后向前的遍历&#xff0c;所以将链表分为两部分&#xff0c;一部分有序一部分无序&#xff0c;将无序的…