排序-插入排序與希爾排序

文章目錄

    • 一、插入排序
    • 二、希爾排序


一、插入排序

思路:

當插入第i(i>=1)個元素時,前面的array[0],array[1],…,array[i-1]已經排好序,此時用array[i]的排序碼與array[i-1],array[i-2],…的排序碼順序進行比較,找到插入位置即將array[i]插入,原來位置上的元素順序后移

如:
在這里插入圖片描述
代碼實現:

void  test(int arr[],int size) {int ned ;//定義一個插入數據的前一個數據的下標for (int i = 0; i < size-1; i++) {ned = i;//從第一個開始int t = arr[ned + 1];//需要插入的數據while (ned >= 0)//當遍歷到最后一個結束{if (arr[ned] > t)//比插入數據大就插入{arr[ned + 1] = arr[ned];//往后移動一位ned--;//--找下一個數據}else//找到比t小的結束break;}arr[ned + 1] = t;//在比t小的數據前一位插入
//這樣就算那個數是最小的我,和下標為0那個位置比完后,ned=-1,
//我們也可以插入到下標為0 的位置}
}
void Print(int arr[], int size) {for (int i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");
}
int main() {int arr[] = { 8,6,9,3,5,1,0,4,2,7 };Print(arr, sizeof(arr) / sizeof(arr[0]));test(arr, sizeof(arr)/sizeof(arr[0]));Print(arr, sizeof(arr) / sizeof(arr[0]));return 0}

運行結果:
在這里插入圖片描述
時間復雜度:
第一層循環怎么都要走N次,第二層循環最好的結果為(已經排好序),為1次,
最壞的結果,(與想要的順序相反),為N次
我們取最壞的結果,N ^ N次,所以時間復雜度O(N^N).

二、希爾排序

思路:
1.實質上還是使用插入排序的思想
2.我們將數組的數據進行分組排序,每間隔 gap 的為一組,這些排序叫做預排序,設置多組間隔為 gap ,經過預排序的數組就會接近有序
如:
![![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/53092304050a4955ad0445ca63ea531e.png](https://img-blog.csdnimg.cn/direct/29136b20dfef4dad9aa57f09367c721c.png

3.那么這個 gap 怎么設置呢?,我們知道,當gap=1時就是相當于直接插入排序,因此我們可以這樣設置,就是gap 由大到小,最后到1,結束
4.gap設置的特點
gap越大,大的數可以越快排到后面,小的數可以越快的排到前面,但是預排完,不是那么接近有序
gap越小 越接近有序
gap=1,就是直接插入排序
如:
在這里插入圖片描述

代碼實現:

void test1(int arr[], int size) {int gap = size;//設為數據的個數int ned = 0;while (gap!= 1)//結束條件;當gap=1時{gap = gap / 3 + 1;//除三或者二都可,每次都會減少,加1保證有一次gap=1//每間隔gap的數據就進行一次插入排序//結束條件:當i+gap>n時for (int i = 0; i < size - gap; i++){//以下和我們上面的插入排序一樣ned = i;int t = arr[ned + f];while (ned >= 0) {if (arr[ned] > t) {arr[ned + gap] = arr[ned];ned -= gap;}elsebreak;}arr[ned + gap] = t;}}
}
void Print(int arr[], int size) {for (int i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");
}int main() {int arr[] = { 8,6,9,3,5,1,0,4,2,7 };Print(arr, sizeof(arr) / sizeof(arr[0]));test1(arr, sizeof(arr) / sizeof(arr[0]));Print(arr, sizeof(arr) / sizeof(arr[0]));return 0;
}

運行結果:
在這里插入圖片描述
時間復雜度:
第一次循環每次除3就是,以3為底的logN,
當gap很大時,因為循環的次數減少,所以后兩層循環的次數很接近N
當gap很小時,因為已經接近有序了,所以循環的次數也接近N
所以時間復雜度為 O(lonN*N)(以3為底的logN)
當然這只時估算的結果,不一定準確
嚴蔚敏老師他的數據結構這本書上是:O(N^1.3)

以上就是我的分享了,如果有什么錯誤,歡迎在評論區留言。
最后,謝謝大家的觀看!

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

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

相關文章

Qt Rsa 加解密方法使用(pkcs1, pkcs8, 以及文件存儲和內存存儲密鑰)

Qt RSA 加解密 完整使用 密鑰格式&#xff1a; pkcs#1pkcs#8 如何區分密鑰對是PKCS1還是PKCS8&#xff1f; 通常PKCS1密鑰對的開始部分為&#xff1a;-----BEGIN RSA PRIVATE KEY-----或 -----BEGIN RSA PUBLIC KEY-----。而PKCS8密鑰對的開始部分為&#xff1a;-----BEGIN…

基于Springboot+mybatis+mysql+jsp招聘網站

基于Springbootmybatismysqljsp招聘網站 一、系統介紹二、功能展示四、其他系統實現五、獲取源碼 一、系統介紹 項目類型&#xff1a;Java EE項目 項目名稱&#xff1a;基于SPringBoot的照片網站 項目架構&#xff1a;B/S架構 開發語言&#xff1a;Java語言 前端技術&…

Swagger Array 逐步解密:帶你簡化開發工作

Swagger 允許開發者定義 API 的路徑、請求參數、響應和其他相關信息&#xff0c;以便生成可讀性較高的文檔和自動生成客戶端代碼。而 Array &#xff08;數組&#xff09;是一種常見的數據結構&#xff0c;用于存儲和組織多個相同類型的數據元素。數組可以有不同的維度和大小&a…

C++初學教程三

目錄 一、運算符 一、自增自減運算符 二、位運算符 三、關系運算符

情緒管理法則

感受情緒&#xff0c;聆聽情緒&#xff0c;接納情緒&#xff0c;管理情緒&#xff0c;將自己從黑暗中拯救出來 感受情緒的價值&#xff0c;了解情緒產生的原因 其實情緒沒有好壞之分&#xff0c;負面情緒是人體自我保護的產物 改變認知方式&#xff0c;做情緒的主人 典型案例…

軌道電流檢測IC——FP355,助力蓄電池充電器、SPS(適配器)、電池管理系統、多口快充充電器的優雅升級

目錄 一、FP355概述 二、FP355特點 三、FP355應用 隨著移動設備的普及和人們對電力需求的不斷增長&#xff0c;充電器的安全性和充電效率成為了重要的關注點。 作為一種能夠精確檢測電流的集成電路&#xff0c;軌道電流檢測IC——FP355是個不錯的選擇。它不僅廣泛應用于蓄電…

SpringBoot集成Spring Security+jwt+kaptcha驗證(簡單實現,可根據實際修改邏輯)

參考文章 【全網最細致】SpringBoot整合Spring Security JWT實現用戶認證 需求 結合jwt實現登錄功能&#xff0c;采用自帶/login接口實現權限控制 熟悉下SpringSecurity SpringSecurity 采用的是責任鏈的設計模式&#xff0c;是一堆過濾器鏈的組合&#xff0c;它有一條很…

P5743 【深基7.習8】猴子吃桃

題目描述 一只小猴買了若干個桃子。第一天他剛好吃了這些桃子的一半&#xff0c;又貪嘴多吃了一個&#xff1b;接下來的每一天它都會吃剩余的桃子的一半外加一個。第 n n n 天早上起來一看&#xff0c;只剩下 1 1 1 個桃子了。請問小猴買了幾個桃子&#xff1f; 輸入格式 …

鴻蒙(HarmonyOS)應用開發——http的使用

在使用app的時候&#xff0c;不可能將所有信息都存儲在app中&#xff0c;是需要鏈接互聯網&#xff0c;從服務端獲取數據。 #mermaid-svg-nP3gq7NrsyR2Df4i {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nP3gq7Nrs…

03_W5500TCP_Client

上一節我們完成了W5500網絡的初始化過程&#xff0c;這節我們進行TCP通信&#xff0c;w5500作為TCP客戶端與電腦端的TCP_Server進行通信。 目錄 1.TCP通信流程圖&#xff1a; tcp的三次握手&#xff1a; tcp四次揮手&#xff1a; 2.代碼分析&#xff1a; 3.測試&#xff1a…

Python游戲測試工具自動化遍歷游戲中所有關卡

場景 游戲里有很多關卡&#xff08;可能有幾百個了&#xff09;&#xff0c;理論上每次發布到外網前都要遍歷各關卡看看會不會有異常&#xff0c;上次就有玩家在打某個關卡時卡住不動了&#xff0c;如果每個關卡要人工遍歷這樣做會非常的耗時&#xff0c;所以考慮用自動化的方…

C語言第十六集(后續)(結構體)

1.匿名結構體(即不寫結構體名)只能用一次, 而且匿名結構體寫法特別危險 兩個匿名結構體盡管內容完全相同,但編譯器仍然認為二位是不相同的類型 結構的特殊聲明搜 2.結構體自己給自己里面包含一個結構體變量((此結構體就是當前所處的這個結構體))指針是沒有問題的,但是 結構…

AI專題報告:2022年中國人工智能產業研究報告

今天分享的AI系列深度研究報告&#xff1a;《AI專題報告&#xff1a;2022年中國人工智能產業研究報告》。 &#xff08;報告出品方&#xff1a;艾瑞咨詢&#xff09; 報告共計&#xff1a;112頁 人工智能參與社會建設的千行百業 價值性、通用性、效率化為產業發展戰略方向 …

淘寶API接口系列丨商品詳情數據接口丨關鍵詞搜索商品列表接口丨商品評論,銷量接口

要對接淘寶API接口&#xff0c;可以按照以下步驟進行操作&#xff1a; 注冊成為淘寶開放平臺開發者&#xff0c;并創建一個應用。在應用創建頁面&#xff0c;需要填寫應用的名稱、描述等信息&#xff0c;并設置應用的API權限等級。獲取App Key和App Secret。在應用創建后&…

淘寶商品詳情:獲取海量優質商品信息

淘寶商品詳情接口&#xff0c;也稱為淘寶商品詳情API&#xff0c;是一個用于獲取淘寶商品詳情的接口。它可以幫助開發者快速獲取淘寶商品信息&#xff0c;從而構建自己的電商應用程序。 在開始使用淘寶商品詳情接口之前&#xff0c;首先需要了解以下幾個概念和步驟&#xff1a…

jira創建用例,與任務關聯

項目用的jira&#xff0c;但之前的用例放在禪道上&#xff0c;或者歸檔于svn&#xff0c;都不是很好用&#xff0c;所以研究了下jira的用法 1、下載插件&#xff1a; synapseRT - Test management and QA in JIRA 完成后在tab會多出一個test 2、常用的功能 1、建立用例&#…

【華為OD題庫-081】最長的元音子串長度-Java

題目 題目描述: 定義當一個字符串只有元音字母一(a,e,i,o,u,A,E,l,O,U)組成&#xff0c; 稱為元音字符串&#xff0c;現給定一個字符串&#xff0c;請找出其中最長的元音字符串&#xff0c;并返回其長度&#xff0c;如果找不到請返回0&#xff0c; 字符串中任意一個連續字符組成…

Gitlab+GitlabRunner搭建CICD自動化流水線將應用部署上Kubernetes

文章目錄 安裝Gitlab服務器準備安裝版本安裝依賴和暴露端口安裝Gitlab修改Gitlab配置文件訪問Gitlab 安裝Gitlab Runner服務器準備安裝版本安裝依賴安裝Gitlab Runner安裝打包工具安裝docker安裝java17安裝maven 注冊Gitlab Runner 搭建自動化部署準備SpringBoot項目添加一個Co…

驗證碼的多種生成策略

&#x1f60a; 作者&#xff1a; 瓶蓋子io &#x1f496; 主頁&#xff1a; 瓶蓋子io-CSDN博客 第一種 a.導入依賴 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.10</ver…

【數據結構】字典樹(Trie樹)算法總結

知識概覽 Trie&#xff1a;高效地存儲和查找字符串集合的數據結構數字、漢字可以用二進制位來存 例題展示 題目鏈接 Trie字符串統計&#xff1a; https://www.acwing.com/problem/content/837/ 代碼 #include <cstdio>const int N 100010;int son[N][26], cnt[N],…