C++中常用的十大排序方法之4——希爾排序

???????????成長路上不孤單😊😊😊😊😊😊

【😊///計算機愛好者😊///持續分享所學😊///如有需要歡迎收藏轉發///😊】

今日分享關于C++中常用的排序方法之4——希爾排序的相關內容!

關于【C++中常用的排序方法之4——希爾排序】

目錄:

  • 一、希爾排序的定義
  • 二、希爾排序的發展歷史
  • 三、希爾排序的的排序過程
  • 四、希爾排序的基本原理
  • 五、希爾排序的的特點
  • 六、希爾排序的的優點
  • 七、希爾排序的的缺點

希爾排序Shell Sort)

一、希爾排序的定義

希爾排序(Shell's Sort)是插入排序的一種又稱“縮小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因 D.L.Shell 于 1959 年提出而得名。

希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至 1 時,整個文件恰被分成一組,算法便終止。

??

二、希爾排序的發展歷史

希爾排序按其設計者希爾(Donald Shell)的名字命名,該算法由希爾在 1959 年所發表的論文“A high-speed sorting procedure”?中所描述。

希爾排序是基于插入排序的以下兩點性質而提出改進方法的:?

?1、插入排序在對幾乎已經排好序的數據操作時,效率高,即可以達到線性排序的效率。

2、但插入排序一般來說是低效的,因為插入排序每次只能將數據移動一位。

1961年,IBM 公司的女程序員 Marlene Metzner Norton(瑪琳·梅茨納·諾頓)首次使用?FORTRAN?語言編程實現了希爾排序算法。在其程序中使用了一種簡易有效的方法設置希爾排序所需的增量序列:第一個增量取待排序記錄個數的一半,然后逐次減半,最后一個增量為 1。該算法后來被稱為 Shell-Metzner 算法?,Metzner 本人在2003年的一封電子郵件中說道:“我沒有為這種算法做任何事,我的名字不應該出現在算法的名字中。”

三、希爾排序的排序過程

1、縮小增量

希爾排序屬于插入類排序,是將整個有序序列分割成若干小的子序列分別進行插入排序。

排序過程:先取一個正整數d1數組元素放一組,組內進行直接插入排序;然后取d2

三趟結果

04 13 27 38 49 49 55 65 76 97

2、Shell排序

Shell排序的算法實現:

1. 不設監視哨的算法描述

void ShellPass(SeqList R,int d)

{//希爾排序中的一趟排序,d為當前增量

for(i=d+1;i

if(R[ i ].key

R[0]=R[i];j=i-d; //R[0]只是暫存單元,不是哨兵

do {//查找R的插入位置

R[j+d]=R[j]; //后移記錄

j=j-d; //查找前一記錄

}while(j>0&&R[0].key

R[j+d]=R[0]; //插入R到正確的位置上

} //endif

該方法實質上是一種分組插入方法

比較相隔較遠距離(稱為增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除多個元素交換。D.L.shell于1959年在以他名字命名的排序算法中實現了這一思想。算法先將要排序的一組數按某個增量d分成若干組,每組中記錄的下標相差d.對每組中全部元素進行排序,然后再用一個較小的增量對它進行分組,在每組中再進行排序。當增量減到1時,整個要排序的數被分成一組,排序完成。

一般的初次取序列的一半為增量,以后每次減半,直到增量為1。

給定實例的shell排序的排序過程

假設待排序文件有10個記錄,其關鍵字分別是:

49,38,65,97,76,13,27,49,55,04。

增量序列的取值依次為:

5,2,1

四、?希爾排序的基本原理?

希爾排序是基于插入排序的一種改進算法。它將整個待排序的記錄序列分割成若干子序列,分別進行直接插入排序。然后逐漸減小間隔,再次進行插入排序,直到整個序列變為有序。希爾排序通過分組插入的方式,每次比較相距較遠的元素,從而減少了逆序對的數量,提高了排序效率。

五、希爾排序的特點

希爾排序?是一種高效的排序算法,由美國計算機科學家Donald Shell于1959年提出。它是插入排序的一種改進版本,通過分組插入排序和縮小增量的方式,大幅度減少了逆序對的數量,從而提高了排序效率。以下是希爾排序的主要特點:

??分組插入排序?:希爾排序將數組分成若干個子序列,每個子序列通過插入排序進行排序。由于子序列的長度較短,插入排序的時間復雜度較低,從而提高了排序效率?。

?縮小增量?:希爾排序通過逐步縮小增量(通常采用二分法遞減增量),將數組分成更小的子序列進行排序。增量最終減小到1時,整個數組進行一次插入排序?。

?大幅度減少逆序對?:由于希爾排序是通過間隔分組進行插入排序的,每次排序都會將相距較遠的元素進行比較和交換,從而大幅度減少了逆序對的數量。逆序對的數量是衡量一個排序算法效率的重要指標,逆序對越少,排序效率越高?。

?非穩定性?:希爾排序是一種非穩定的排序算法。在排序過程中,相同大小的元素可能會發生交換,導致原來相對順序的改變。盡管如此,希爾排序在實際應用中并不影響排序結果的正確性?。

?適用場景?:希爾排序適用于大部分情況,尤其適用于部分有序的數據集。當數據集接近有序時,希爾排序的效率非常高?。?

六、希爾排序的優點

?希爾排序的優點主要包括以下幾個方面?:?

?減少比較次數?:希爾排序通過分組插入的方式進行排序,每次比較相距較遠的元素,從而大幅度減少了逆序對的數量,提高了排序效率。

?高效處理大數據量?:希爾排序在處理大量數據時表現出色,其時間復雜度通常為O(n^1.3),并且空間復雜度為O(1),這意味著它需要的額外空間非常小。

?簡單易實現?:希爾排序的實現相對簡單,易于理解和編寫代碼。

?適用于大規模數據?:希爾排序特別適合處理大規模數據,因為它通過分組和逐步減小增量來排序,避免了直接對整個數據集進行排序的時間和空間復雜度過高的問題。

七、希爾排序的缺點

?非穩定性?:希爾排序是一種非穩定的排序算法,可能會改變相同元素的相對順序。

?性能受增量序列影響?:增量序列的選擇對希爾排序的性能有很大影響。如果增量序列選擇不當,可能會導致時間復雜度退化為O(n^2)甚至更差。

?時間復雜度不確定?:希爾排序的時間復雜度并不固定,通常認為是O(n^1.3),但最壞情況下可能會更差。

七、插入排序的缺點

?插入排序的主要缺點包括以下幾個方面?:

?時間復雜度較高?:插入排序的時間復雜度在最壞的情況下是O(n^2),其中n是待排序元素的數量。這意味著當數據量較大時,插入排序的效率會顯著下降,不適合處理大規模數據集?。

?不適用于部分有序的數據?:雖然插入排序在數據部分有序的情況下表現較好,但如果數據已經接近排序狀態,其他排序算法(如歸并排序或快速排序)通常會更高效?。

?不穩定?:插入排序是一種不穩定的排序算法,相同的元素在排序后可能會改變它們原有的順序。這意味著如果輸入數組中有重復的元素,排序后這些元素的相對順序可能會發生變化?。

?不適合實時應用?:由于插入排序的時間復雜度較高,它不適合需要快速響應的應用場景,如實時數據處理系統?。

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

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

相關文章

詳細描述以太坊的gas、gaslimit、gasPrice

目錄 一、Gas 是什么? ? 簡要定義: ?? 舉例理解: 二、Gas Limit 是什么? ? 簡要定義: 分兩種: 舉例說明: 三、Gas Price 是什么? ? 簡要定義: 為什么它重要? 示例: 四、 EIP-1559 后的新機制(倫敦升級) 三個要素: 五、額外技巧(開發實用) 本文…

全國大學生數學建模競賽賽題深度分析報告(2010-2024)

全國大學生數學建模競賽賽題深度分析報告(2010-2024) 全國大學生數學建模競賽(CUMCM)是中國最具影響力的大學生科技競賽之一,本報告將對2010-2024年間的賽題進行全面統計分析,包括題目類型、領域分布、模型方法等多個維度&#x…

從獎勵到最優決策:動作價值函數與價值學習

從獎勵到最優決策:動作價值函數與價值學習 價值學習一、動作價值函數對 U t U_t Ut?求期望得到動作價值函數動作價值函數的意義最優動作價值函數(Optimal Action-Value Function)如何理解 Q ? Q^* Q?函數 二、價值學習的基本思想Deep Q-Network(DQN)DQN玩游戲的具…

智能手表該存什么音頻和文本?場景化存儲指南

文章目錄 為什么需要“場景化存儲”?智能手表的定位手機替代不了的場景碎片化的場景存儲 音頻篇:智能手表該存什么音樂和音頻?運動場景通勤場景健康場景 文本篇:哪些文字信息值得放進手表?(部分情況可使用圖…

液態神經網絡技術指南

一、引言 1.從傳統神經網絡到液態神經網絡 神經網絡作為深度學習的核心工具,在圖像識別、自然語言處理、推薦系統等領域取得了巨大成功。尤其是卷積神經網絡(CNN)、循環神經網絡(RNN)、長短期記憶網絡(LS…

hive通過元數據庫刪除分區操作步驟

刪除分區失敗: alter table proj_60_finance.dwd_fm_ma_kpi_di_mm drop partition(year2025,month0-3,typeADJ); 1、查詢分區的DB_ID、TBL_ID – 獲取數據庫ID-26110 SELECT DB_ID FROM DBS WHERE NAME ‘proj_60_finance’; – 獲取表ID-307194 SELECT TBL_ID FR…

1990-2019年各地級市GDP數據

1990-2019年各地級市GDP數據 1、時間:1990-2019年 2、來源:城市年鑒 3、指標:行政區劃代碼、年份、省份、城市、經度、緯度、地區生產總值(萬元) 4、范圍:250地級市 5、指標解釋:地區生產總值(Gross R…

滄州鐵獅子

又名“鎮海吼”,是中國現存年代最久、形體最大的鑄鐵獅子,具有深厚的歷史文化底蘊和獨特的藝術價值。以下是關于滄州鐵獅子的詳細介紹: 歷史背景 ? 鑄造年代:滄州鐵獅子鑄造于后周廣順三年(953年)&#…

《Java八股文の文藝復興》第十一篇:量子永生架構——對象池的混沌邊緣(終極試煉·完全體)

Tags: - Java高并發 - 量子架構 - 混沌工程 - 賽博修真 - 三體防御 目錄: 卷首語:蝴蝶振翅引發的量子海嘯 第一章:混沌初開——對象池的量子涅槃(深度擴展) 第二章:混沌計算——對象復活的降維打擊&…

Java面試34-Kafka的零拷貝原理

在實際應用中,如果我們需要把磁盤中的某個文件內容發送到遠程服務器上,那么它必須要經過幾個拷貝的過程: 從磁盤中讀取目標文件內容拷貝到內核緩沖區CPU控制器再把內核緩沖區的數據復制到用戶空間的緩沖區在應用程序中,調用write…

TF-IDF忽略詞序問題思考

自從開始做自然語言處理的業務,TF-IDF就是使用很頻繁的文本特征技術,他的優點很多,比如:容易理解,不需要訓練,提取效果好,可以給予大規模數據使用,總之用的很順手,但是人…

SQL122 刪除索引

alter table examination_info drop index uniq_idx_exam_id; alter table examination_info drop index full_idx_tag; 描述 請刪除examination_info表上的唯一索引uniq_idx_exam_id和全文索引full_idx_tag。 后臺會通過 SHOW INDEX FROM examination_info 來對比輸出結果。…

Langchat平臺知識庫測試

平臺介紹: LangChat是Java生態下企業級AIGC項目解決方案,集成RBAC和AIGC大模型能力,幫助企業快速定制AI知識庫、企業AI機器人。 支持的AI大模型:Gitee AI / 阿里通義 / 百度千帆 / DeepSeek / 抖音豆包 / 智譜清言 / 零一萬物 /…

Vue3 Composition API 深度開發指南

Vue3 Composition API 深度開發指南 響應式系統核心解析 1.1 響應式原理解構 Vue3 基于 Proxy 實現響應式追蹤,其核心流程為: const reactiveHandler {get(target, key, receiver) {track(target, key) // 依賴收集return Reflect.get(target, key, …

基于自回歸模型的酒店評論生成

《DeepSeek大模型高性能核心技術與多模態融合開發(人工智能技術叢書)》(王曉華)【摘要 書評 試讀】- 京東圖書 我們使用新架構的模型完成情感分類,可以看到,使用注意力機制可以很好地對特征進行抽取從而完成二分類的情感分類任務…

關于轉置卷積

🧠 具體講解神經網絡中的轉置卷積(Transposed Convolution) 🧭 1. 轉置卷積的動機:為什么我們需要它? 標準卷積通常會降低特征圖的空間尺寸(比如從 64x64 → 32x32),這對…

JavaScript 模塊化詳解( CommonJS、AMD、CMD、ES6模塊化)

一.CommonJS 1.概念 CommonJS 規范概述了同步聲明依賴的模塊定義。這個規范主要用于在服務器端實現模塊化代碼組 織,但也可用于定義在瀏覽器中使用的模塊依賴。CommonJS 模塊語法不能在瀏覽器中直接運行;在瀏覽器端,模塊需要提前編譯打包處理…

TCP BBR 的優化

前段時間,老板發了篇資料,下面是我學習的相關記錄整理。 https://aws.amazon.com/cn/blogs/china/talking-about-network-optimization-from-the-flow-control-algorithm/ PS:ubuntu24默認使用的tcp控制算法。還是 cubic sysctl net.ipv4.tc…

什么是異步?

什么是異步? 異步是一個術語,用于描述不需要同時行動或協調就能獨立運行的流程。這一概念在技術和計算領域尤為重要,它允許系統的不同部分按自己的節奏運行,而無需等待同步信號或事件。在區塊鏈技術中,異步是指網絡中…

SSM婚紗攝影網的設計

🍅點贊收藏關注 → 添加文檔最下方聯系方式咨詢本源代碼、數據庫🍅 本人在Java畢業設計領域有多年的經驗,陸續會更新更多優質的Java實戰項目希望你能有所收獲,少走一些彎路。🍅關注我不迷路🍅 項目視頻 SS…