希尔排序算法——交换法

        希尔排序,又称缩小增量排序,是插入排序的改进版。它是因DL.Shell于1959年提出而得名。希尔排序的实质就是分组插入排序,该方法是非稳定的排序算法。

        具体来说,希尔排序通过将待排序序列分成多个子序列,分别进行插入排序,最后再进行一次整体的插入排序,从而提高了排序效率。在缩小增量排序中,初始步长较大,但是随着排序的进行,步长会逐渐减小,这也是希尔排序比直接插入排序高效的原因。

算法思想:将元素数组分为 元素 /2 组,第一次步长为 (arr.length / 2),一次减半,然后,将其依次比较,将较少的数放到前面的位置。经过数次的排序后,就可以得到排序后的数据。

推导过程:

public class Sortshell {public static void main(String[] args) {int arr[] = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};System.out.println(Arrays.toString(arr));shellSort(arr);}//使用逐步推导的方式来编写希尔排序public static void shellSort(int[] arr) {int temp = 0;//希尔排序的第一轮排序for (int i = 5; i < arr.length; i++) {//遍历各数组中所有的元素(共5组,每组有2个元素),=,步长5for (int j = i - 5; j >= 0; j -= 5) {//如果当前元素大于加上步长后的那个元素,说明交换if (arr[j] > arr[j + 5]) {temp = arr[j];arr[j] = arr[j + 5];arr[j + 5] = temp;}}}System.out.println(Arrays.toString(arr));//希尔排序的第一轮排序for (int i = 2; i < arr.length; i++) {//遍历各数组中所有的元素(共5组,每组有2个元素),=,步长5for (int j = i - 2; j >= 0; j -= 2) {//如果当前元素大于加上步长后的那个元素,说明交换if (arr[j] > arr[j + 2]) {temp = arr[j];arr[j] = arr[j + 2];arr[j + 2] = temp;}}}System.out.println(Arrays.toString(arr));//希尔排序的第一轮排序for (int i = 1; i < arr.length; i++) {//遍历各数组中所有的元素(共5组,每组有2个元素),=,步长5for (int j = i - 1; j >= 0; j -= 1) {//如果当前元素大于加上步长后的那个元素,说明交换if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}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};System.out.println("希尔排序:" + Arrays.toString(arr));shellSort(arr);}//使用逐步推导的方式来编写希尔排序public static void shellSort(int[] arr) {int temp = 0;//希尔排序的第一轮排序int count = arr.length / 2;int total = 0;while (count > 0) {total++;for (int i = count; i < arr.length; i++) {//遍历各数组中所有的元素(共count组,每组有(arr.length / count)个元素),=,步长countfor (int j = i - count; j >= 0; j -= count) {//如果当前元素大于加上步长后的那个元素,说明交换if (arr[j] > arr[j + count]) {temp = arr[j];arr[j] = arr[j + count];arr[j + count] = temp;}}}System.out.println("第" + total + "轮:" + Arrays.toString(arr));count /= 2;}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

罗技k380连不上蓝牙?

我一直以为是键盘锁住了&#xff0c;或者我按一些键 什么的可以解决&#xff0c;但是都没用。 解决方案&#xff1a;由于我把键盘放在了金属表面 &#xff0c;导致蓝牙失灵。 在官网上找到的解决方案&#xff0c;连接放在这里&#xff0c;里面还提到了不能在一些特殊的地方操…

大数据Doris(四十九):Doris数据导出介绍

文章目录 Doris数据导出介绍 一、​​​​​​​使用示例

CMake入门教程【核心篇】引用子模块.cmake文件(include)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 include子模块举个例…

C#编程-使用构造函数和析构函数

使用构造函数和析构函数 如果想要在以创建对象时就初始化成员变量,可以创建名为构造函数的特殊函数。您可能还需要使用对象后从内存中删除这些对象。这可通过称为析构函数的函数实现。 实现构造函数 构造函数是在创建对象时自动调用的特殊方法。无须显式地调用构造函数。请…

使用MQTT.JS创建一个网页版的MQTT客户端

一、MQTT.JS介绍 MQTT.js 是一个开源的 MQTT 协议的客户端库&#xff0c;使用 JavaScript 编写&#xff0c;主要用于 Node.js 和 浏览器环境中。是JavaScript 环境下的 MQTT 客户端库。可以用于微信小程序、支付宝小程序等定制浏览器环境。 我们可以直接在HTML文件中进行调用…

CMake是什么?为什么学习CMake

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1.CMake简介2.为什么…

RK3566 ANDROID 11 平台上适配移远EC200A

适配前理清楚一下调试的流程&#xff1a; 1.该模块为LGA封装&#xff0c;需要控制上电时序模块才能正常上电工作&#xff1a; 2.模块供电正常后&#xff0c;读取模组的PID 和VID 并将其ID添加到内核里面&#xff0c;确保USB转Serial端口能够正常生成: 3.生成ttyUSB0~ttyUSB2…

【报错解决】TypeError: __init__() got an unexpected keyword argument ‘size‘

报错描述 我在使用Doc2vec训练模型时&#xff0c;遇到了这一报错&#xff0c;相应的代码及报错信息如下所示&#xff1a; #代码model Doc2Vec(x_train, min_count5, window5, sizesize, sample1e-4, negative5,workersmultiprocessing.cpu_count())#报错信息TypeError: __in…

Redis(二)

1、redis的持久化 "Redis 如何将数据写入磁盘"&#xff0c;首先要明白的时候&#xff0c;我们使用的redis的数据保存在内存上的&#xff0c;也就是说&#xff0c;只要我们的电脑关机或者重启服务器&#xff0c;那么在内存中的数据就会消失&#xff0c;所以要想持久化…

06.02 customizing plots with style sheets

使用 style 来配置 pyplot 风格 import matplotlib.pyplot as plt import numpy as np%matplotlib inlinestyle 是 pyplot 的一个子模块&#xff0c;方便进行风格转换&#xff0c; pyplot 有很多的预设风格&#xff0c;可以使用 plt.style.available 来查看&#xff1a; plt.…

浅谈命令模式

命令模式是一种行为设计模式&#xff0c;用于将一个请求封装成一个对象&#xff0c;从而使得请求的发送者和接收者解耦&#xff0c;并支持对请求进行参数化、队列化、撤销和重做等操作。 在命令模式中&#xff0c;有一下介个关键角色&#xff1a; Command&#xff08;命令&am…

ubuntu 卸载桌面

要卸载Ubuntu上的桌面环境&#xff0c;您可以按照以下步骤进行操作&#xff1a; 登录到您的Ubuntu系统&#xff0c;并打开终端。 确认您当前正在使用的桌面环境。可以运行以下命令来查看已安装的桌面环境&#xff1a; s /usr/share/xsessions/ 根据您当前使用的桌面环境&…

爆肝整理,接口性能测试总结,一篇直接上高速...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、 性能测试术语…

初级前端算法

题目1 题目描述&#xff1a; 找出数组中的最大值 输入&#xff1a; [3, 9, 2, 5, 1] 输出&#xff1a; 9 JavaScript解答&#xff1a; function findMaxValue(arr) {let max arr[0];for (let i 1; i < arr.length; i) {if (arr[i] > max) {max arr[i];}}return m…

新概念英语第二册(18)

【New words and expressions】生词和短语&#xff08;3&#xff09; pub n. 小酒店 landlord n. 店主 bill n. 帐单 【Text】 After I had had lunch at a village pub, I looked for my…

【量化】商品期货换月的处理思路(old)

商品期货存在换月的情况&#xff0c;即期货合约是有到期日的&#xff0c;如果不想实物交割就得将持仓转换到之后的合约上&#xff0c;而不同月份的价格是不一样的&#xff0c;也就是不连续的&#xff0c;在回测中需要处理换月带来的跳空&#xff1a; 比如上图中的PG是逐月换月…

const的基础用法

#include<iostream> using namespace std;void main() {const int a 0;int const b 1;//一样const int * c;//const修饰的是指针所指向的内存空间(即值)&#xff0c;不能被修改int* const d NULL;//const修饰的指针变量不能被修改const int* const eNULL;//const修饰的…

uni-app 从入门到精通 3天快速掌握 文字版 学习专栏

大家好&#xff0c;我是java1234小锋老师。 近日锋哥又卷了一波课程&#xff0c;uni-app 从入门到精通 3天快速掌握教程&#xff0c;文字版视频版。三天掌握。 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从…

亚信安慧AntDB数据库——通信运营商核心系统的全面演进

AntDB数据库源自通信运营商核心系统&#xff0c;经过15年的平稳运行和不断演进&#xff0c;成功跟随通信技术的升级步伐&#xff0c;逐步迈向5G时代&#xff0c;并且在这期间完成了8次大版本的迭代&#xff0c;为行业树立了技术领先的典范。其独特之处在于具备超融合架构&#…

如何在win7同样支持Webview2 在 WPF 中使用本地 Webview2 ,如何不依赖系统 Runtime

项目运行环境&#xff1a; .Net Framework 4.5.2 Windows 7 x64 Service Pack 1 WebView2 Microsoft.WebView2.FixedVersionRuntime.120.0.2210.91.x64 考虑到很多老项目&#xff0c;本项目使用的是.Net Framework 4.5.2&#xff0c;.Net 更高版本的其实也是可以支持的。 …