希爾排序【Java算法】

文章目錄

    • 1. 概念
    • 2. 思路
    • 3. 代碼實現

1. 概念

希爾排序也是一種插入排序,它是簡單插入排序經過改進之后的一個更高效的版本,也稱為縮小增量排序。希爾排序在數組中采用跳躍式分組的策略,通過某個增量將數組元素劃分為若干組,然后分組進行插入排序,隨后逐步縮小增量,繼續按組進行插入排序操作,直至增量為1。

推薦一個B站六分鐘的視頻,PPT動畫做的非常好,清晰明了。

在這里插入圖片描述

2. 思路

① 希爾排序采用跳躍式的分組方式,什么是跳躍式?也就是說同一組內的成員在原序列中實際上是互相隔著一段距離的,它們被迫抽出來組成一隊,內部采用插入排序比較大小。它們互相隔著的距離是相等的,這個距離我們稱它為增量,增量怎么確定?一般來說,初始增量值為序列長度的一半,接下來我們根據增量值計算分組,如下圖增量為5,所以索引0跟索引5一組,索引1跟索引6一組 …,以此類推,序列被分成了五組;

在這里插入圖片描述
② 分了組之后,組員內部要進行插入排序的,但是這里的插入排序步長其實并不是1,我們知道原本的插入排序是從右往左一步一步地比較大小并插入的,但是希爾排序是跳躍式分組的,雖然說你們被分到了同一個隊伍里,但是不要忘記了,你們本身的索引并不相連,索引還是原來位置的索引,所以,在這里插入排序的時候,每一步的長度應該是增量的大小,除了步長不一樣外,其它思路都不變;

③ 在第一輪排序完成之后,發現整體上序列的順序有了一個大體的趨勢,小的基本在左邊,大的基本在右邊,但這才是第一步還不算排好序;

④ 再開始下一輪排序,每一輪開始時的增量值都應是上一輪增量值的一半。原理還不變,外部分組,內部插入排序,什么時候不再分組,不再排序?增量值一直減半,總有一天它會減為1,到1的時候就是全體序列進行最基本的插入排序了,沒錯這是最后一步,所以終止條件就是增量值開始小于1,這時候的序列已經完全有序。

3. 代碼實現

import java.util.Arrays;public class Test {public static void main(String[] args) {int[] arr = {2, 9, 3, 11, 7, 8, 4, 1, 6};int[] newArr = sort(arr);System.out.println(Arrays.toString(newArr));}public static int[] sort(int[] arr) {//控制增量值,初始值為序列長度的一半,每次減半,步長為0時停止for (int step = arr.length / 2; step > 0; step /= 2) {//控制待插入元素的位置,初始值為增量值for (int i = step; i < arr.length; i++) {//待插入元素int insertVal = arr[i];//待比較元素初始位置int index = i - step;//控制待比較元素的位置,初始值為待插入元素的位置減去增量值,即indexwhile (index >= 0 && insertVal < arr[index]) {//當前待比較元素向后移一位,這里的一位就是step長度arr[index + step] = arr[index];//指針向左挪動一位,繼續跟下一個元素作比較index -= step;}//退出循環后后,將待插入元素插入到index的下一位arr[index + step] = insertVal;}}return arr;}
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39234.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39234.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39234.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS學習—制作全局遮罩

在.h文件中線聲明show()方法 - (void)show; .m文件中添加全屏遮罩&#xff0c;在遮罩上添加了一個選擇框并添加了底部彈出的動畫&#xff0c;可自行在其中添加tableview、pickerview等其他視圖&#xff0c;并添加了點擊選擇框視圖外區域隱藏 #import "MaskView.h"…

Java:PO、VO、BO、DO、DAO、DTO、POJO

&#x1f497;wei_shuo的個人主頁 &#x1f4ab;wei_shuo的學習社區 &#x1f310;Hello World &#xff01; Java&#xff1a;PO、VO、BO、DO、DAO、DTO、POJO PO持久化對象&#xff08;Persistent Object&#xff09; PO是持久化對象&#xff0c;用于表示數據庫中的實體或表…

tauri-vue:快速開發跨平臺軟件的架子,支持自定義頭部UI拖拽移動和窗口陰影效果

Tauri Vue Typescript 一個使用 taurivuets 開發跨平臺軟件的模板&#xff0c;支持窗口頭部自定義 UI 和拖拽和窗口陰影&#xff0c;不用再自己做適配了&#xff0c;拿來即用&#xff0c;非常 nice。而且已經封裝好了 tauri 的 http 請求工具&#xff0c;省去很多彎路。開源…

分布式 - 消息隊列Kafka:Kafka消費者分區再均衡(Rebalance)

文章目錄 01. Kafka 消費者分區再均衡是什么&#xff1f;02. Kafka 消費者分區再均衡的觸發條件&#xff1f;03. Kafka 消費者分區再均衡的過程&#xff1f;04. Kafka 如何判定消費者已經死亡&#xff1f;05. Kafka 如何避免消費者的分區再均衡?06. Kafka 消費者分區再均衡有什…

UglifyJS 和JShaman相比有什么不同?都可以進行js混淆加密嗎?

UglifyJS 和JShaman相比有什么不同&#xff1f; UglifyJS主要功能是壓縮JS代碼&#xff0c;減小代碼體積&#xff1b;JShaman是專門用于對JS代碼混淆加密&#xff0c;目的是讓JS代碼變的不可讀、混淆功能邏輯、加密代碼中的隱秘數據或字符&#xff0c;是用于代碼保護的。 因此…

java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration

錯誤&#xff1a; java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfigurationat org.apache.hadoop.hive.ql.exec.tez.TezSessionPoolSession$AbstractTriggerValidator.startTriggerValidator(TezSessionPoolSession.java:74)at org.apache.hadoop.hive.ql.e…

音視頻技術開發周刊 | 306

每周一期&#xff0c;縱覽音視頻技術領域的干貨。 新聞投稿&#xff1a;contributelivevideostack.com。 人工智能研究人員聲稱&#xff0c;通過Zoom音頻檢測擊鍵的準確率為93% 通過記錄按鍵并訓練深度學習模型&#xff0c;三位研究人員聲稱&#xff0c;基于單個按鍵的聲音特征…

eclipse 導入項目js報錯問題

eclipse 導入項目后會出現項目中的js文件報錯&#xff08;紅叉&#xff09;&#xff0c;如下圖所示&#xff0c;有時候報錯的文件很多&#xff0c;需要集中處理。 解決辦法&#xff1a; 右鍵項目名稱》Properties》MyEclipse》JavaScript》Include Path&#xff0c;在右側選擇“…

vim鍵盤圖

國外&#xff1a;http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html&#xff0c;原創&#xff0c;有SVG圖&#xff0c;有分步驟的圖。 國內翻譯&#xff1a;[https://blog.csdn.net/qq_41052753/article/details/101031847 有幾個配色&#xff0c;很高清&…

【華為Datacom 綜合拓撲案例—分享篇】

拓撲圖 題目要求 實驗要求&#xff1a; 1、PC1\PC2\PC3\PC4采用DHCP自動獲取IP地址&#xff0c;SW5作為服務器&#xff0c;SW3和SW4作為中繼 創建地址池ip pool huawei1和ip pool huawei2&#xff0c;租期都為2天 2、SW3與SW4做鏈路聚合&#xff0c;采用LACP模式。SW3作為主…

【Java 集合框架API接口】Collection,List,Set,Map,Queue,Deque

博主&#xff1a;_LJaXi Or 東方幻想郷 專欄&#xff1a; Java | 從跨行業到跨平臺 開發工具&#xff1a;IntelliJ IDEA 2021.1.3 Java集合框架 API接口 Collection接口List接口HashSet&#xff0c; TreeSetSet接口使用 HashSet 實現使用 TreeSet 實現 HashMap、TreeMapMap接口…

SQL-每日一題【1341. 電影評分】

題目 表&#xff1a;Movies 表&#xff1a;Users 請你編寫一個解決方案&#xff1a; 查找評論電影數量最多的用戶名。如果出現平局&#xff0c;返回字典序較小的用戶名。查找在 February 2020 平均評分最高 的電影名稱。如果出現平局&#xff0c;返回字典序較小的電影名稱。 …

Nokia5110使用方法及實例編寫51單片機

文章目錄 Nokia5110實物圖引腳和原理圖51單片機實例軟件模擬SPI實現控制Nokia5110顯示字符發送字節時序圖(圖片太多了,關鍵圖片已截取出來)初始化需要配置實例編寫回顧接線結束Nokia5110 Nokia是諾基亞拆下來的屏幕。使用SPI控制 84x48 的點陣 LCD,可以顯示 4 行漢字,采用…

ZZULIOJ 1194: 總成績排序(結構體專題),Java

ZZULIOJ 1194: 總成績排序&#xff08;結構體專題&#xff09;&#xff0c;Java 題目描述 有一學生成績表&#xff0c;包括學號、姓名、3門課程成績。請按如下規則排序&#xff1a;按總成績降序排序&#xff0c;若總成績相同&#xff0c;則按姓名升序排序。 輸入 首先輸入一…

MySQL 約束

查看約束 select * from information_schema.table_constraints where table_name要查看的表名按約束的作用范圍 列級約束&#xff1a; 將此約束聲明在對應字段的后面 表級約束&#xff1a;在表中所有字段都聲明完&#xff0c;在所有字段的后面聲明的約束&#xff0c;可以聲明…

屏蔽惡意域名的DNS查詢

因為有一些惡意域名, 已經在防火墻上做了封禁了, 但是如果收到中毒主機的請求, 還是要去做一次DNS查詢, 因此被上級單位通告, 因此想把惡意域名的DNS查詢封禁做到防火墻下聯的AC上面, 一方面因為防火墻的策略優先級DNS代理比較靠后, 另一方面也是為了減小防火墻壓力, 簡化配置:…

【leetcode】鏈表part2

24. 兩兩交換鏈表中的節點 迭代方法 public static ListNode swapPairs(ListNode head) {// 輸入&#xff1a;head [1,2,3,4]// 輸出&#xff1a;[2,1,4,3]ListNode dummy new ListNode(0);dummy.next head;ListNode cur dummy;while (cur.next ! null && cur.ne…

數據結構的樹存儲結構

數據結構的樹存儲結構 之前介紹的所有的數據結構都是線性存儲結構。本章所介紹的樹結構是一種非線性存儲結構&#xff0c;存儲的是具有“一對多”關系的數據元素的集合。 (A) (B) 圖 1 樹的示例 圖 …

【Java】2021 RoboCom 機器人開發者大賽-高職組(復賽)題解

7-8 人工智能打招呼 號稱具有人工智能的機器人&#xff0c;至少應該能分辨出新人和老朋友&#xff0c;所以打招呼的時候應該能有所區別。本題就請你為這個人工智能機器人實現這個功能&#xff1a;當它遇到陌生人的時候&#xff0c;會說&#xff1a;“Hello X, how are you?”其…

chatglm2-6b模型在9n-triton中部署并集成至langchain實踐 | 京東云技術團隊

一.前言 近期&#xff0c; ChatGLM-6B 的第二代版本ChatGLM2-6B已經正式發布&#xff0c;引入了如下新特性&#xff1a; ①. 基座模型升級&#xff0c;性能更強大&#xff0c;在中文C-Eval榜單中&#xff0c;以51.7分位列第6&#xff1b; ②. 支持8K-32k的上下文&#xff1b…