【排序算法】②希爾排序

系列文章目錄

?第一篇:【排序算法】①直接插入排序-CSDN博客

第二篇:【排序算法】②希爾排序-CSDN博客

第三篇:【排序算法】③直接選擇排序-CSDN博客

第四篇:【排序算法】④堆排序-CSDN博客

第五篇:【排序算法】⑤冒泡排序-CSDN博客

第六篇:【排序算法】⑥快速排序:Hoare、挖坑法、前后指針法-CSDN博客

第七篇:【排序算法】⑦歸并排序-CSDN博客


目錄

系列文章目錄

前言

一、希爾排序是什么?

算法思想

二、為什么希爾排序能做到排序?

三、實現希爾排序

四、分析希爾排序

總結



前言

所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。

為什么我們要學習排序?筆者認為有兩點理由:一是面對浩如煙海的各種數據,我們應該學習如何分類、控制這些數據,而排序自然是少不了的;二是人類社會從古至今一直在“排序”,人與人之間,物與物之間,排序涉及到社會的方方面面。

學習并理解排序,不僅有助于工作學習,或許對一些其他方面的理解也會起動到推的效果。


一、希爾排序是什么?

希爾排序法又稱縮小增量法,是在直接插入排序的基礎上進行優化得來的排序算法。

算法思想

希爾排序法的基本思想是:先選定一個間距整數gap,把待排序文件中所有記錄分成gap個組,所有距離為gap的記錄分在同一組內,并對每一組內的記錄進行直接插入排序。然后,gap--,重復上述分組和排序的工作。當到達gap=1時,所有記錄在統一組內排好序。

簡單來說,希爾排序分為“預排序”和“正式排序”兩步。


二、為什么希爾排序能做到排序?

這里筆者畫了草圖以幫助大家理解希爾排序:

假設我們排升序,數組為{7 ,1 ,3 ,9 ,6 ,5 ,4 ,8 ,2 ,0}

假設設gap=3:

此時將gap-1,在再上一次排序的基礎上排:

gap=2,數組為{0,1,2,4,6,3,7,8,5,9}

再將gap-1,此時gap==1,實質上成為直接插入排序。

為什么要分幾次預排序,然后還要調用直接插入排序?

還記得插入排序什么時候效率最高嗎,當數組接近有序的時候!預排序的過程其實就是讓數組接近有序,為后面的gap=1時的插入排序做準備,也就是說希爾排序的最后一步必須是gap==1時的直接插入排序!

三、實現希爾排序

void ShellSort(int* a, int n)
{if (!a)return;int gap = n;//gap>1:確保最后一趟gap==1while (gap > 1){gap = gap / 3 + 1;for (int i = 0; i < n - 1; i += gap){int end = i;int temp = a[end + gap];while (end >= 0&&end+gap<n){//if (temp > a[end])遞減if(temp < a[end])//遞增{a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = temp;}}
}

代碼講解:

①gap=gap/3,通過將gap/3快速將整個區間劃分為多個小區間進行預處理操作。這里除以3是基于前人所做的大量總結中得出的最優解:在效率和計算復雜度間取得平衡。

若gap/2,則遞減過慢且中間需要較多次的預排序過程;若gap/>3的數,則遞減過快,難以達成預排序的目的:讓數組變得盡量有序。

②gap=gap/3+1,這個+1的目的是確保gap永不小于 1,并且使得最后一次循環必定執行gap==1時的直接插入排序。

③for循環中實質為直接插入排序,在上一篇中已經介紹過,若讀者有疑惑的地方歡迎在評論區討論。


四、分析希爾排序

1. 希爾排序是對直接插入排序的優化。


2. 當gap > 1時都是預排序,目的是讓數組更接近于有序。當gap == 1時,數組已經接近有序的了,這樣就會很快。這樣整體而言,可以達到優化的效果。

3.時間復雜度:希爾排序的時間復雜度較難計算,需要用到數學中的概率論證明,這里就省略證明過程,希爾排序的時間復雜度隨gap的變化而變化,上述代碼中的gap=gap/3+1的時間復雜度為O(N^1.3);

4.空間復雜度為O(1);

5.穩定性分析:不穩定!希爾排序的不穩定性源于它在排序過程中會進行長距離的元素交換,這可能導致相同值的元素在排序后改變相對順序。

比如:數組{5A, 2, 1 ,?5B, 3}(5A和5B是值相同但需區分順序的兩個元素),希爾排序最后結果為{1,2,3,5B,5A},排序前5A在5B前,排序后5A在5B后!


總結

本文是【排序算法】系類第二篇,主要介紹了什么希爾排序,以及如何實現希爾排序,最后分析了希爾排序的特性。

希望對你有所幫助。

閱完點贊,手留余香~

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

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

相關文章

Linux Shell為文件添加BOM并自動轉換為unix格式

1.添加并查看BOM添加bomvim -c "set bomb|set fileencodingutf-8|wq" ./gradlew查看bomhead -c 3 ./gradlew | hexdump -C2.安裝dos2unix并轉換為unix格式安裝sudo apt install dos2unix轉換dos2unix ./gradlew

華清遠見25072班C語言學習day5

重點內容&#xff1a;數組&#xff1a;為什么有數組&#xff1f;為了便于存儲多個數據特點&#xff1a;連續存儲多個同種數據類型元素(連續指內存地址連續)數組名&#xff1a;數組中首元素的地址&#xff0c;是一個地址常量。一維整形數組&#xff1a;定義&#xff1a;數據類型…

安全守護,溫情陪伴 — 智慧養老產品上新

- 養老智慧看護終端接入螢石開放平臺 - 在2025 ECDC螢石云開發者大會&#xff0c;螢石產品經理已經介紹了基于螢石云服務AI能力適老化設備的養老智能能力開放。 而今天&#xff0c;養老智慧看護終端再升級&#xff0c;集成跌倒檢測、物理隱私遮蔽、火柴人遮蔽、AI語音智能體…

鴻蒙flutter項目接入極光推送

推送的自分類權益 需要審核15個工作日&#xff0c;實際約3個工作日 項目使用極光推送flutter代碼&#xff0c;代碼端已經配置的東西&#xff08;需要配置flutter端和對應各自平臺原生端&#xff09;&#xff0c;我的工程是多target&#xff0c;所以和單target有一點不同。 一、…

2025牛客多校第八場 根號-2進制 個人題解

J.根號-2進制 #數學 #FFT 思路 賽后發現身邊的同學都是通過借位來解決進位問題的&#xff0c;在此提供一種全程不出現減法的順推做法 首先A,BA,BA,B可以理解為兩個多項式&#xff1a;A0A1?2A2(?2)2…A_{0}A_{1}\sqrt{ -2 }A_{2}(\sqrt{ -2 })^2\dotsA0?A1??2?A2?(?…

DataEase官方出品丨SQLBot:基于大模型和RAG的智能問數系統

2025年8月7日&#xff0c;DataEase開源項目組發布SQLBot開源項目&#xff08;github.com/dataease/SQLBot&#xff09;。SQLBot是一款基于大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;和RAG&#xff08;Retrieval Augmented Generation&#xff0c;…

第十四節 代理模式

在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一個類代表另一個類的功能。這種類型的設計模式屬于結構型模式。在代理模式中&#xff0c;我們創建具有現有對象的對象&#xff0c;以便向外界提供功能接口。介紹意圖&#xff1a;為其他對象提供一種代理以控制對…

訓推一體 | 暴雨X8848 G6服務器 x Intel?Gaudi? 2E AI加速卡

近日&#xff0c;暴雨信息攜手英特爾&#xff0c;針對Gaudi 2E AI加速器HL-288 PCIe卡&#xff08;簡稱IntelGaudi 2E PCIe卡&#xff0c;下同&#xff09;完成專項調優與適配工作&#xff0c;并重磅推出Intel Eagle Stream平臺4U8卡解決方案。該方案通過軟硬件協同優化&#x…

GB17761-2024標準與電動自行車防火安全的技術革新

隨著我國電動自行車保有量突破3.5億輛&#xff0c;這一便捷的交通工具已成為城市出行的重要組成。然而&#xff0c;伴隨市場規模擴大而來的是日益突出的安全問題——2023年全國電動自行車火災事故高達2.5萬起&#xff0c;年均增長率約20%&#xff0c;火災中塑料件加速燃燒并釋放…

利用容器編排完成haproxy和nginx負載均衡架構實施

1 創建測試目錄和文件[rootdocker-a ~]# mkdir lee [rootdocker-a ~]# cd lee/ [rootdocker-a lee]# touch docker-compose.yml # 容器編排工具Docker Compose 默認識別docker-compose.yml文件2 編寫docker-compose.yml文件和haproxy.cfg文件2.1 核心配置說明2.1.1 服務結構共定…

WinRAR v7.13 烈火漢化穩定版,解壓縮全格式專家

[軟件名稱]: WinRAR v7.13 烈火漢化穩定版 [軟件大小]: 3.8 MB [下載通道]: 夸克盤 | 迅雷盤 軟件介紹 WinRAR 壓縮文件管理器&#xff0c;知名解壓縮軟件&#xff0c;電腦裝機必備軟件&#xff0c;國內最流行最好用的壓縮文件管理器、解壓縮必備軟件。它提供 RAR 和 ZIP 文…

強化學習常用數據集

強化學習常用數據集數學推理數據集數值標簽GSM8K&#xff08;2021 OpenAI)問答數據集在LLM場景下進行強化學習訓練的時候&#xff0c;時常會涉及到各種各樣的數據集&#xff0c;容易記不住&#xff0c;因此開個帖子記錄一下。可采取的分類方法有很多&#xff0c;這里直接按照領…

ROS2學習(1)—基礎概念及環境搭建

文章目錄核心框架環境搭建小烏龜機器人控制小烏龜啟動鍵盤控制啟動rqt查看ros節點關系核心框架 這里有幾個比較重要的概念&#xff1a; 四大通信機制&#xff1a;話題&#xff08;Topic&#xff09;、服務&#xff08;Service&#xff09;、動作&#xff08;Action&#xff09…

基于STM32單片機超聲波測速測距防撞報警設計

1 系統功能介紹 本設計是一套基于 STM32F103C8T6 單片機 的超聲波測速測距防撞報警系統&#xff0c;能夠實現對目標物體的實時測距與測速&#xff0c;并通過 TFT 彩屏進行動態顯示&#xff0c;同時根據用戶設定的距離與速度閾值進行報警提示。該系統不僅可以用于固定場景的安全…

麒麟系統播放 pptx

目錄 python 操作 LibreOffice 控制pptx 一頁一頁播放 1. 安裝 LibreOffice&#xff08;麒麟系統基于 Debian/Ubuntu&#xff09; 2. 如果只想安裝 PPT 播放/轉換&#xff08;Impress&#xff09; 1. 啟動 LibreOffice UNO 服務 2. Python 控制播放uno安裝方法&#xff1a…

嵌入式Linnux學習 -- 軟件編程2

四、IO1. 概念1. IO 指 input / output2. Linux系統中一切皆是文件3. IO操作的對象是文件2. 文件1. 概念一段數據的集合2. 特點文件通常存放在外存中&#xff0c;掉點后數據不會丟3. 分類b&#xff08;block&#xff0c;塊設備文件&#xff09;-- 按塊掃描信息的文件&#x…

Spark02 - SparkContext介紹

一、應用入口&#xff1a;SparkContextSpark Application 程序入口為&#xff1a;SparkContext&#xff0c;任何一個應用首先需要構建 SparkContext 對象&#xff0c;如下兩步構建&#xff1a;第一步、創建 SparkConf 對象設置 Spark Application 基本信息&#xff0c;比如應用…

Selenium動態元素定位

動態元素定位方法一&#xff1a;使用CSS選擇器通過部分匹配操作符定位動態屬性中的固定部分。*&#xff08;包含&#xff09;&#xff0c;^&#xff08;開頭&#xff09;&#xff0c;$&#xff08;結尾&#xff09;。/* 匹配id前綴為user_的元素 */ cssdiv[id^"user_"…

OBOO鷗柏丨115寸商用屏/工業液晶顯示器招標投標核心標底參數要求

整機參數要求&#xff1a;商用液晶顯示器/工業LCD一體機/商業智能終端機/工業防爆顯示器/招標投標核心標底參數要求1、整機屏幕采用≥采用115英寸超高清原廠原包原裝工業LCD液晶屏面板&#xff1b;具有高色域&#xff0c;顯示動態視頻、web及3D動畫時&#xff0c;保障運動畫面流…

麻溜啟動Oracle實例demo

注意&#xff1a;鏡像非常大并且外網網絡過慢&#xff0c;可能得pull一天&#xff08;n次超時&#xff09;。。md后臺靜默pull命令&#xff1a; nohup docker pull container-registry.oracle.com/database/express:latest > pull.log 2>&1 & 啟動實例&#xff1…