当前位置: 首页 > news >正文

【算法】希尔排序

目录

          • 1. 说明
          • 2. 举个例子
          • 3. java代码示例
          • 4. java示例截图

1. 说明
  • 1.希尔排序是直接插入排序的一种改进,其本质是一种分组插入排序
  • 2.希尔排序采取了分组排序的方式
  • 3.把待排序的数据元素序列按一定间隔进行分组,然后对每个分组进行直接插入排序
  • 4.随着间隔的减小,一直到1,从而使整个序列变得有序
  • 5.希尔排序适用于大多数数据元素有序的序列,由于排序期间,同一元素的顺序会经常移动,所以希尔排序不是稳定的排序方法
2. 举个例子
  • 示例: [6, 2, 4, 3, 5, 1]
  • 1.获取数组的长度6
  • 2.计算间隔gap=6/2=3 (将数组分为3组,6和3比较,2和5比较,4和1比较)
  • 3.【6和3比较】拿到索引为0的数6(array[j-gap])与索引为3的数3(temp)进行比较,6>3即array[j-gap] > temp, 6 > 3,将索引为3的数改为6,得到数组[6, 2, 4, 6, 5, 1],j=j-gap=3-3=0,0小于gap跳出while循环
  • 4.将索引为0的数改为3,得到数组[3, 2, 4, 6, 5, 1]
  • 5.【2和5比较】拿到索引为1的数2(array[j-gap])与索引为4的数5(temp)进行比较,2<5则不进行while循环,将索引为4的数改为5(本身就是5,改了不影响), 数组不做改变
  • 6.【4和1比较】拿到索引为2的数4(array[j-gap])与索引为5的数1(temp)进行比较,4>1即array[j-gap] > temp, 4 > 1,将索引为5的数改为4,得到数组[3, 2, 4, 6, 5, 4],j=j-gap=5-3=2,2小于gap跳出while循环
  • 7.将索引为2的数改为1,得到数组[3, 2, 1, 6, 5, 4]
  • 8.计算间隔gap=3/2=1,当间隔为1时,数组中的数字基本有序,再进行插入排序
  • 9.取索引为1的数2,比较索引为0的数3,2小于3,则将索引为1的数改为3,索引为0之前没有数了,得到数组[2, 3, 1, 6, 5, 4]
  • 10.取索引为2的数1,比较索引为1的数3,1小于3,则将索引为2的数改为3,索引为1之前有索引为0的数2,1小于2,则将索引为1的数改为2,索引为0的数改为1 (大数往后挪),得到数组[1, 2, 3, 6, 5, 4]
  • 11.取索引为3的数6,比较索引为2的数3,6大于3,继续
  • 12.取索引为4的数5,比较索引为3的数6,5小于6,则将索引为4的数改为6,索引为3之前有索引为2的数3,5大于3,则将索引为3的数改为5,得到数组[1, 2, 3, 5, 6, 4]
  • 13.取索引为5的数4,比较索引为4的数6,4小于6,则将索引为5的数改为6,索引为4之前有索引为3的数5,4小于5,则将索引为4的数改为5,得到数组[1, 2, 3, 5, 5, 6];索引为3之前有索引为2的数3,4大于3,则将所因为3的数改为4,得到数组[1, 2, 3, 4, 5, 6]
3. java代码示例
package com.learning.algorithm.sort;/*** 希尔排序* 示例: 6, 2, 4, 3, 5, 1* 1.获取数组的长度6* 2.计算间隔gap=6/2=3 (将数组分为3组,6和3比较,2和5比较,4和1比较)* 3.【6和3比较】拿到索引为0的数6(array[j-gap])与索引为3的数3(temp)进行比较,6>3即array[j-gap] > temp, 6 > 3,将索引为3的数改为6,得到数组[6, 2, 4, 6, 5, 1],j=j-gap=3-3=0,0小于gap跳出while循环* 4.将索引为0的数改为3,得到数组[3, 2, 4, 6, 5, 1]* 5.【2和5比较】拿到索引为1的数2(array[j-gap])与索引为4的数5(temp)进行比较,2<5则不进行while循环,将索引为4的数改为5(本身就是5,改了不影响), 数组不做改变* 6.【4和1比较】拿到索引为2的数4(array[j-gap])与索引为5的数1(temp)进行比较,4>1即array[j-gap] > temp, 4 > 1,将索引为5的数改为4,得到数组[3, 2, 4, 6, 5, 4],j=j-gap=5-3=2,2小于gap跳出while循环* 7.将索引为2的数改为1,得到数组[3, 2, 1, 6, 5, 4]* 8.计算间隔gap=3/2=1,当间隔为1时,数组中的数字基本有序,再进行插入排序* 9.取索引为1的数2,比较索引为0的数3,2小于3,则将索引为1的数改为3,索引为0之前没有数了,得到数组[2, 3, 1, 6, 5, 4]* 10.取索引为2的数1,比较索引为1的数3,1小于3,则将索引为2的数改为3,索引为1之前有索引为0的数2,1小于2,则将索引为1的数改为2,索引为0的数改为1 (大数往后挪),得到数组[1, 2, 3, 6, 5, 4]* 11.取索引为3的数6,比较索引为2的数3,6大于3,继续* 12.取索引为4的数5,比较索引为3的数6,5小于6,则将索引为4的数改为6,索引为3之前有索引为2的数3,5大于3,则将索引为3的数改为5,得到数组[1, 2, 3, 5, 6, 4]* 13.取索引为5的数4,比较索引为4的数6,4小于6,则将索引为5的数改为6,索引为4之前有索引为3的数5,4小于5,则将索引为4的数改为5,得到数组[1, 2, 3, 5, 5, 6];索引为3之前有索引为2的数3,4大于3,则将所因为3的数改为4,得到数组[1, 2, 3, 4, 5, 6]*/
public class ShellSort {public static void sort(int[] array) {  int len = array.length;  for (int gap = len / 2; gap > 0; gap /= 2) {  for (int i = gap; i < len; i++) {  int temp = array[i];  int j = i;int index = j - gap;while (j >= gap && array[index] > temp) {array[j] = array[j - gap];j -= gap;index = j - gap;}  array[j] = temp;  }  }  }public static void print(int[] array) {for (int i : array) {System.out.print(i + " ");}}public static void main(String[] args) {int array[] = {6, 2, 4, 3, 5, 1};sort(array);  print(array);}  
}
4. java示例截图

在这里插入图片描述

相关文章:

  • HR看好的字符函数和字符串处理函数!!!
  • [MySQL]日期和时间函数
  • 计算机网络体系的形成
  • leetcode977. 有序数组的平方
  • springBoot整合task
  • 【STL】手撕 string类
  • llama.cpp部署通义千问Qwen-14B
  • 五分钟带你看完黑客设备
  • WPF窗口样式的比较
  • Chrome显示分享按钮
  • 如何解决谷歌浏览器无法更新、谷歌翻译无法使用问题
  • JavaSE基础50题:7. 写一个方法返回参数二进制中1的个数(3种方法!)
  • go自定义端口监听停用-------解决端口被占用的问题
  • Vue3 setup语法糖
  • 用Java写一个王者荣耀游戏
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • bearychat的java client
  • Bootstrap JS插件Alert源码分析
  • Centos6.8 使用rpm安装mysql5.7
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Spring-boot 启动时碰到的错误
  • Spring声明式事务管理之一:五大属性分析
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • win10下安装mysql5.7
  • XML已死 ?
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 浮现式设计
  • 经典排序算法及其 Java 实现
  • 入门到放弃node系列之Hello Word篇
  • 优秀架构师必须掌握的架构思维
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (02)Hive SQL编译成MapReduce任务的过程
  • (3)nginx 配置(nginx.conf)
  • (C语言)逆序输出字符串
  • (ibm)Java 语言的 XPath API
  • (java)关于Thread的挂起和恢复
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (poj1.2.1)1970(筛选法模拟)
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (定时器/计数器)中断系统(详解与使用)
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)linux文件内容查看
  • (转载)Google Chrome调试JS
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net framework4与其client profile版本的区别
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .net项目IIS、VS 附加进程调试
  • /etc/fstab 只读无法修改的解决办法