Java排序算法(四)希尔排序2

希尔排序移步法:分组+直接插入排序组合

一、测试类SortTest

import java.util.Arrays;

public class SortTest {

  private static final int L = 20;
  public static void main(String[] args) {

  int [] arr = new int[6];
  for (int i = 0; i < arr.length; i++) {
  arr[i] = (int)((Math.random()+1)*L);
  }
  System.out.println(Arrays.toString(arr));
  // new Sort().BubbleSort(arr);
  // new Sort().SelectionSort(arr);
  // new Sort().InsertSort(arr);

  // new Sort().ShellSort1(arr);
  new Sort().ShellSort2(arr);

  System.out.println(Arrays.toString(arr));
  }  
}

二、排序类Sort

  /**
  *
  * <h1>希尔排序-移步法</h1>
  * <ul>
  * <li> 希尔排序移步法,先分组,然后进行插入排序
  * </ul>
  * @param arr the array
  * @author linzm
  * @since 1.8
  *
  */
public void ShellSort2(int[] arr) {
  int sep = arr.length/2;
  while(sep >= 1) {
  /*
  * 假设length=8,第一次分组8/2 = 4 组
  * 第二次分组,4/2 = 2组 假设第一组为 3 8 0 -1 2
  * 第二次分组的第一组{3, 8, 0, -1, 2}下标分别为0, 2, 4, 6
  * first:3 8 0 -1 2
  * second:0 3 8 -1 2(直接插入)3 8 8 -1 2
  * 3 3 8 -1 2
  * 0 2 8 -1 2
  * third:-1 0 3 8 2(直接插入)
  * fourth:-1 0 2 3 8
  *
  */
    for (int i = sep; i < arr.length; i++) {
    // 标记待插入变量,右边往左边插入
    // 移位法
    // 假设i=2,j=2
      int j = i - sep;// 被插入位置
      int insertVal = arr[i]; // 待插入数
      if(arr[j] > arr[j+sep]) {
        while(j >= 0 && insertVal < arr[j]) {
          arr[j+sep] = arr[j];
          j -= sep;
          }
      }
    arr[j+sep] = insertVal;
    }
  sep /= 2;
  }
}

仅供参考,有错误还请指出!

有什么想法,评论区留言,互相指教指教。

Java排序算法(四)希尔排序2的更多相关文章

  1. 【DS】排序算法之希尔排序(Shell Sort)

    一.算法思想 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法.希尔排序是基于插入排序的以下两点性质而提出改进方法的:1)插入排序在对几乎已经排好序的数据操作 ...

  2. 数据结构与算法之PHP排序算法(希尔排序)

    一.基本思想 希尔排序算法是希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接 ...

  3. 我的Java开发学习之旅------>Java经典排序算法之希尔排序

    一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名. Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔 ...

  4. 算法相关——Java排序算法之希尔排序(五)

    个子块,即{3,5},{1,0},{5,2},{9,4},{6,12},将每个子块进行插入排序(即第i位与第i+5位进行比较交换),初步排序结果为{3,0,2,4,6,5,1,5,9,12}.希尔排序 ...

  5. java排序算法之希尔排序

    希尔排序是冲破二次时间屏障的第一批算法之一. 它是通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到最后一趟(比较相邻元素)为止.因此希尔排序也叫缩减增量排序. 希尔排序使 ...

  6. 【排序算法】希尔排序算法 Java实现

    希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎 ...

  7. Java学习笔记——排序算法之希尔排序(Shell Sort)

    落日楼头,断鸿声里,江南游子.把吴钩看了,栏杆拍遍,无人会,登临意. --水龙吟·登建康赏心亭 希尔算法是希尔(D.L.Shell)于1959年提出的一种排序算法.是第一个时间复杂度突破O(n²)的算 ...

  8. 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)

    插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良.因此直接插入算法是基础,这里先进行直接插入算法的分析与编码. 直接插入算法的排序思想:假设有 ...

  9. 排序算法之希尔排序的python实现

    希尔排序(Shell’s Sort)是插入排序的一种,是直接插入排序算法的一种更高版本的改进版本. 希尔排序的工作原理 如下: (1)把记录按步长gap分组,对每组记录采用直接插入排序方法进行排序: ...

  10. js排序算法06——希尔排序

    希尔排序本质是一种插入排序,由一位叫希尔的大神提出得名,其基本思想是将数组分组进行插入排序,每次消除不止一个逆序对,这样就提高了插入排序的效率.最后一步进行一间隔的插入排序,此时数组已经基本有序.代码 ...

随机推荐

  1. Modbus仿真器 Modbus Poll 和Modbus Slave详细图文教程

    Modbus Poll 是Witte Software公司开发的的Modbus主机仿真器,用于测试和调试Modbus从设备.软件支持ModbusRTU.ASCII.TCP/IP协议.支持多设备监控,可 ...

  2. linux系统修改Swap分区【转】

    在装完Linux系统之后自己去修改Swap分区的大小(两种方法) 在安装完Linux系统后,swap分区太小怎么办,怎么可以扩大Swap分区呢?有两个办法,一个是从新建立swap分区,一个是增加swa ...

  3. Goland 设置代码格式化

    前言 之前一直喜欢 VsCode 的代码自动格式化和其他的一些功能 今天了解到原来 Goland 也有这些功能, 想想也对, 毕竟这么大 正文 Goland设置代码格式化 进入设置,按需选择要使用的, ...

  4. Hive Query生命周期 —— 钩子(Hook)函数篇

    无论你通过哪种方式连接Hive(如Hive Cli.HiveServer2),一个HQL语句都要经过Driver的解析和执行,主要涉及HQL解析.编译.优化器处理.执行器执行四个方面. 以Hive目前 ...

  5. innobackupex: Connecting to MySQL server with DSN 'dbi:mysql

    [root@ma src]# innobackupex --user=root /root/backup --no-timestamp InnoDB Backup Utility v1.5.1-xtr ...

  6. 【Python】用字母生成图像

    用字母生成图像会用到matplotlib.pyplot库 所以需要安装这个库 pip install matplotlib 等待安装完成即可 ps:由于网络原因,会出现多次的timeout,可以使用国 ...

  7. leetcode 1593. 拆分字符串使唯一子字符串的数目最大(DFS,剪枝)

    题目链接 leetcode 1593. 拆分字符串使唯一子字符串的数目最大 题意: 给你一个字符串 s ,请你拆分该字符串,并返回拆分后唯一子字符串的最大数目. 字符串 s 拆分后可以得到若干 非空子 ...

  8. Java安全之Weblogic 2018-3248分析

    Java安全之Weblogic 2018-3248分析 0x00 前言 基于前面的分析,后面的还是主要看补丁的绕过方式,这里就来简单的记录一下. 0x01 补丁分析 先来看看补丁细节 private ...

  9. JAVA之路_假克隆、浅克隆、深克隆

    一.JAVA假克隆 Java中,对于基本类型,可以用"="进行克隆,而对于引用类型却不能简单的使用"="进行克隆,这与JAVA的内存使用空间有关,JAVA在栈中 ...

  10. Python 日志打印之自定义logger handler

    日志打印之自定义logger handler By:授客 QQ:1033553122 #实践环境 WIN 10 Python 3.6.5 #实践代码 handler.py #!/usr/bin/env ...