插入排序與希爾排序(C語言實現)

1.插入排序

由上面的動圖可以知道插入排序的邏輯就是從第一個元素開始往后遍歷,如果找到比前一個元素小的(或者大的)就往前排,所以插入排序的每一次遍歷都會保證前面的數據是有序的,接下類用代碼進行講解。

我們這里傳兩個參數,一個是數組,一個是數組元素的個數。

排序接口我們采用大事化小的想法來進行講解,?我們先來思考單趟遍歷要達成的目標。我們每次遍歷的主角其實就是我們要操縱的那一個元素,比如我們要排第四個元素,按照插入排序的邏輯,前三個元素我們是已經有序了,所以我們接下來的操作就是將我們的主角元素跟前面的元素進行比較,如果元素比前面的小我們就跟前面的交換(我們這里實現升序排序),以此循環往復,直到遇到比它還小的元素我們就終止循環,所以我們就可以理解里面這層while循環的意思了,循環結束的時候不要忘記把元素放到停止循環的end下標位置上,有的同學可能一時間沒有理解到為什么最后下標的位置是end+1,其實這是因為在結束while循環之前我們的end是減一過的,所以才要給他加回去。

然后我們的for循環就是控制我們的主角啦,就是控制后面的每一個元素跟前面已經排序好的元素進行比較。

插入排序最壞的時間復雜度O(n^2)

最好的情況就是這個數組已經有序的時候時間復雜度為O(n)

2.希爾排序

?上訴動態演示就是希爾排序,大家看到這個演示的時候肯定會兩眼一黑,看不懂它是如何進行排序的,希爾排序的邏輯是有點復雜,但是我相信在我講了它的實現思路之后對希爾排序也會有一個比較清晰的理解。

希爾排序可以相當于插入排序的pro版本,這是因為它的邏輯雖然比插入排序復雜,但是卻是建立在插入排序之上,插入排序的核心思想是遍歷每一個元素去跟前面已經排好序的元素進行比較,希爾排序有一個預排序的過程,就是說通過給定一個gap(變量名)來控制一個間距,使下標為end的元素跟end+gap來比較,這個預排序就是使一個無序數組接近有序數組,在預排序完成之后再用插入排序使數組有序。其實到這里大家就會發現,如果用這里的思想去理解插入排序的話,插入排序實際上就是gap為1的情況嘛。

我們用代碼來加深理解。

這是希爾排序的代碼,我們可以看到gap的初始值設置的是數組的長度,那下面的while循環時什么意思呢?我們先來理解最里層的while循環,最里層的while循環是不是有一種很眼熟的感覺?它就是我們的插入排序的思想,只不過插入排序是間隔為一進行比較,希爾排序是間隔為gap進行比較,我們再看外面這層for循環,這層for循環控制的就是end的下標,跟插入排序也非常的相似,只不過這里的for循環結束的條件是n-gap,因為既讓我們當前下標的元素要跟后一個相比,那總不能讓end+gap的下標超出界限吧。

最后再來看最外層的while循環,它的作用就是控制gap的值。我們這里得要知道gap越大,這一趟預排序就越不能做到很有序的程度,但好處就是耗時短,gap的值越小就是相反的情況,但是不要忘記了,一個數組越有序,插入排序處理得就越快,希爾排序也是一樣的,所以為了達到理想的時間復雜度,我們的做法就是將gap的值由大到小。

接下來來說說gap的值如何來設置,gap的值該如何來設置是沒有一個統一的說法的,但是有一個大佬想出的一個比較好的方法是用數組長度來充當第一次的gap值,每一次循環完就將gap的值/3+1這是為了避免上一個gap為二的時候下一次gap直接變為0了。

所以我們的希爾排序最后一趟就是我們的插入排序,只不過這個時候數組已經非常接近有序了。

我們的希爾排序最壞的情況下時間復雜度是O(n^2),平均是O(n^1.3)。

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

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

相關文章

bash中通過變量中的內容獲取對應的關聯數組

bash中通過變量中的內容獲取對應的關聯數組 Bash declare 手冊: https://phoenixnap.com/kb/bash-declare 實際問題: 在 bash 中創建了多個關聯數組,需要根據輸入的值,獲取不同的關聯數組。 可以使用 if 進行多次判斷&#xff…

智能優化算法應用:基于浣熊算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用:基于浣熊算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用:基于浣熊算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.浣熊算法4.實驗參數設定5.算法結果6.參考文獻7.MATLAB…

解決HTTP錯誤500.19 - internal server error -內部服務器錯誤的終極指南

在開發和維護網絡應用程序時,難免會遇到各種HTTP錯誤代碼。其中,HTTP錯誤500.19 - 內部服務器錯誤可謂是最令人頭痛的問題之一。當你的應用程序遇到這個錯誤時,它似乎就像一道墻壁,擋住了你前進的道路。但別擔心,本篇技…

Git全局設置命令---設置提交人姓名

介紹 使用git命令設置提交人姓名 命令 git config --global user.name "超音速"

react-photo-view 的介紹、安裝、使用。

目錄 基本介紹 安裝 使用 基本介紹 react-photo-view 是一個基于 React 的圖片查看器組件,用于在網頁上展示和瀏覽圖片。該組件提供了用戶友好的界面和交互,可以輕松地在應用程序中集成并使用。 支持觸摸手勢,拖動/平移/物理效果滑動…

修改移遠提供的GobiNet、quectel-CM源碼,使其支持有方N720 4G模塊

最近在研究imx6ull linux下4G模塊驅動的移植,參考的移遠ec20的移植方法,添加了GobiNet驅動,編譯了quectel-CM工具,并且可以正常撥號,分配到ip,如下: ping外網也沒有壓力,如下…

軟件工程 考試重點

結構化分析 考慮數據和處理的需求分析方法,稱為結構分析方法(SA) 結構化分析基于 分解、抽象 的基本思想 分解:對于復雜的系統,為將復雜度降低到可以掌握的程度,可以把大問題分解為若干個小問題&#xf…

【go-zero】go-zero使用ent框架 如何使用源生sql完成查詢

背景 本篇教程我們采用的是go-zero的快速腳手架工具 simple-admin 框架的開發 github地址:https://github.com/suyuan32/simple-admin-core 因為框架推薦使用Ent 這篇教程我們則對Ent的基本使用的幾種形式進行一個總結 一、開啟ent的源生sql 1、simple-admin生成rpc 【go-…

QT 中 線程池 (備查)

QRunnable類 API 1)在Qt中使用線程池需要先創建任務,添加到線程池中的每一個任務都需要是一個 QRunnable 類型,因此在程序中需要創建子類繼承 QRunnable 這個類。 2)然后重寫 run() 方法,在這個函數中編寫要在線程池中…

RabbitMQ使用指南

介紹主要特點常用插件使用RabbitMQ的插件常用插件列表 應用場景Kafka與RabbitMq的區別主要優缺點安裝步驟插件安裝步驟 使用RabbitMqJava代碼示例拓展 介紹 RabbitMQ是由Erlang語言開發的,基于AMQP(高級消息隊列協議)協議實現的開源消息代理…

元宇宙紅色展廳VR虛擬展館提高受訓者的參與感

生活在和平年代的新一代青少年,可能對革命先烈英勇事跡難以有很深的體會,無法切實感受到中國共產黨無畏犧牲、誓死保家衛國的紅色精神,因此借助VR虛擬現實制作技術,讓參觀者們走近革命先烈中,感受老一輩無產階級革命家…

搜索引擎和網絡瀏覽器之間的區別

術語“搜索引擎”和“網絡瀏覽器”與互聯網有關。搜索引擎基本上是用于通過 Internet 搜索信息的工具,而 Web 瀏覽器是用于加載網頁等 HTML 文件的應用軟件。 閱讀本文以了解有關搜索引擎和網絡瀏覽器以及它們之間的區別的更多信息。 什么是搜索引擎? …

TrustZone之SMC異常

作為支持兩個安全狀態的一部分,該架構包括了Secure Monitor Call(SMC)指令。執行SMC會引發Secure Monitor Call異常,該異常目標是EL3。 通常,SMC用于請求服務,可以是來自駐留在EL3中的固件,也可…

微信小程序適配方案:rpx(responsive pixel響應式像素單位)

小程序適配單位:rpx 規定任何屏幕下寬度為750rpx 小程序會根據屏幕的寬度自動計算rpx值的大小 Iphone6下:1rpx 1物理像素 0.5css 小程序編譯后,rpx會做一次px換算,換算是以375個物理像素為基準,也就是在一個寬度…

迭代器失效及解決辦法

當使用迭代器遍歷容器并刪除元素時&#xff0c;迭代器可能會失效。 對于vector來說&#xff0c;如果使用普通迭代器&#xff08;例如std::vector<int>::iterator&#xff09;進行遍歷和刪除操作&#xff0c;當你刪除一個元素后&#xff0c;后面的元素會向前移動填補空缺…

服務器如何保證數據安全_Maizyun

服務器如何保證數據安全 在當今的數字化時代&#xff0c;數據安全已經成為企業和社會組織必須面對的重要問題。服務器作為存儲和處理大量數據的核心組件&#xff0c;必須采取有效的措施來確保數據的安全。本文將探討服務器如何保證數據安全。 一、訪問控制和身份認證 訪問控…

nvm,node,npm,yarn相關安裝報錯問題記錄

問題一&#xff1a; yarn : 無法加載文件 D:\jsPackage\nodejs\node_global\yarn.ps1&#xff0c;因為在此系統上禁止運行腳本。 解決&#xff1a; 步驟1,powerShell以管理員運行后&#xff0c;輸入命令: get-ExecutionPolicy 查看權限, 會看到它的返回值是 Restricted , 意…

計算一組x和y(一維數組)

輸入30個整數a1,a2,a3,…,a30&#xff0c;計算所有的x與y。已知&#xff1a; 輸入格式: 30個整數 輸出格式: 計算得到的x1, x2,.......,x10 計算得到的y1, y2,.......,y10 所有輸出精確到小數點后3位。 注意&#xff1a; 1、輸出的每個“”左右各有一個空格&#xff0c;輸出…

堅鵬:興業銀行EAST5.0政策解讀及數據質量提升方案培訓

興業銀行股份有限公司&#xff08;簡稱“興業銀行”&#xff09;成立于1988年8月&#xff0c;2022年總資產9.27萬億元&#xff0c;是經國務院、中國人民銀行批準成立的首批股份制商業銀行之一&#xff0c;總行設在福州市。現已發展成為橫跨境內外&#xff0c;線上線下結合&…

12.8 作業

1&#xff0c; 使用手動連接&#xff0c;將登錄框中的取消按鈕使用qt4版本的連接到自定義的槽函數中&#xff0c;在自定義的槽函數中調用關閉函數 將登錄按鈕使用qt5版本的連接到自定義的槽函數中&#xff0c;在槽函數中判斷ui界面上輸入的賬號是否為"admin"&#…