【數據結構初階】--排序(一):直接插入排序,希爾排序

🔥個人主頁:@草莓熊Lotso

🎬作者簡介:C++研發方向學習者

📖個人專欄:?《C語言》?《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》

??人生格言:生活是默默的堅持,毅力是永久的享受。

前言:在前面的學習中,我們實現了順序表和鏈表,棧和隊列以及二叉樹。通過這些知識的學習和實現我們的代碼能力也有了一定的提升。那么我們從這篇博客開始就進入到了初階數據結構最后一個板塊,排序的學習。我們會學習多種排序,其實每種排序單獨拿出來都不會很難。但是如果讓我們自己去實現的話就不是那么容易的了。還是和之前一樣,我們先分部分來講解。


目錄

一.排序的概念及應用?

?常見的排序算法:

二.直接插入排序

代碼實現:?

時間復雜度:?

三.希爾排序

代碼實現:

時間復雜度:

四.直接插入排序和希爾排序的性能對比

代碼演示:


一.排序的概念及應用?

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

--我們在日常生活中經常可以見到排序的使用,比如購物平臺的篩選排序,還有各種各樣的排行榜

?常見的排序算法:

--如圖所示


二.直接插入排序

基本思想:直接插入排序是一種簡單的插入排序法,其基本思想是把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的序列中,直到所有的記錄插入完為止,最后得到一個新的有序序列。

--我們在實際生活中玩撲克牌時,就用了插入排序的思想

直接插入排序的特性:元素集合越接近有序,直接插入排序算法的時間效率越高

代碼實現:?

void InsertSort(int* arr, int n)
{for (int i = 0; i < n - 1; i++){int end = i;int tmp = arr[end + 1];while (end >= 0){//升序:>   降序:<if (arr[end] > tmp){arr[end + 1] = arr[end];end--;}else {break;}}arr[end + 1] = tmp;}
}

圖示如下:?

test.c:?

#include"Sort.h"void PrintArr(int* arr, int n)
{for (int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");
}void test1()
{int a[] = { 5, 3, 9, 6, 2, 4, 7, 1, 8 };int size = sizeof(a) / sizeof(a[0]);printf("排序前:");PrintArr(a, size);//直接插入排序InsertSort(a, size);printf("排序后:");PrintArr(a, size);
}int main()
{test1();return 0;
}

--測試完成,打印沒有問題,排成了升序,退出碼為0

時間復雜度:?

  • O(n^2)


三.希爾排序

基本思想:希爾排序(Shell Sort)是一種改進的插入排序算法,其核心思想是通過將數組分割成若干個“子序列”逐步縮小排序范圍,最終實現整體有序。

--先選定?個整數(通常是gap = n/3+1),把待排序文件所有記錄分成各組,所有的距離相等的記錄分在同一組內,并對每?組內的記錄進行排序,然后gap=gap/3+1得到下?個整數,再將數組分成各組,進行插入排序,當gap=1時,就相當于直接插入排序。

希爾排序的特性:

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

代碼實現:

void ShellSort(int* arr, int n)
{int gap = n;while(gap>1){ gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++)//用i++比用i+=gap省了一個循環{int end = i;int tmp = arr[end + gap];while (end >= 0){//升序:>   降序:<if (arr[end] > tmp){arr[end + gap] = arr[end];end -= gap;}else {break;}}arr[end + gap] = tmp;}}
}

圖示如下:?

為啥要用gap=gap/3-1:

test.c:?

#include"Sort.h"void PrintArr(int* arr, int n)
{for (int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");
}void test1()
{int a[] = { 5, 3, 9, 6, 2, 4, 7, 1, 8 };int size = sizeof(a) / sizeof(a[0]);printf("排序前:");PrintArr(a, size);//希爾排序ShellSort(a, size);printf("排序后:");PrintArr(a, size);
}int main()
{test1();return 0;
}

--測試完成,打印沒有問題,升序排列正確,退出碼為0

時間復雜度:

  • O(n^1.3)


四.直接插入排序和希爾排序的性能對比

--除了通過時間復雜度以外,我們也可以通過下面這串代碼來實現兩種排序的性能對比

代碼演示:

#include"Sort.h"void PrintArr(int* arr, int n)
{for (int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");
}void test1()
{int a[] = { 5, 3, 9, 6, 2, 4, 7, 1, 8 };int size = sizeof(a) / sizeof(a[0]);printf("排序前:");PrintArr(a, size);//直接插入排序//InsertSort(a, size);//希爾排序ShellSort(a, size);printf("排序后:");PrintArr(a, size);
}// 測試排序的性能對比
void TestOP()
{srand(time(0));const int N = 100000;int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);for (int i = 0; i < N; ++i){a1[i] = rand();a2[i] = a1[i];}int begin1 = clock();InsertSort(a1, N);int end1 = clock();int begin2 = clock();ShellSort(a2, N);int end2 = clock();printf("InsertSort:%d\n", end1 - begin1);printf("ShellSort:%d\n", end2 - begin2);free(a1);free(a2);
}int main()
{TestOP();//test1();return 0;
}

--測試完成,可以看出10w個數據排序,希爾排序的用時比直接插入排序少很多(單位:ms)


往期回顧:

【數據結構初階】--二叉樹(四)

【數據結構初階】--二叉樹(五)

【數據結構初階】--二叉樹(六)

結語:本篇博客就到此結束了,主要實現了一下兩種插入排序,一個直接插入排序,一個希爾排序。我們通過對比可知希爾排序大部分情況下都是優于直接插入排序的。這里聲明一下,博主這里展示的都是Sort.c文件和test.c文件,其中.h文件由于比較簡單這里就不展示了,大家可以直接看圖片。如果文章對你有幫助的話,歡迎評論,點贊,收藏加關注,感謝大家的支持。

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

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

相關文章

Hive SQL (HQL) 編輯指南

Hive SQL&#xff08;HQL&#xff09;是基于Hive的數據倉庫查詢語言&#xff0c;語法類似標準SQL&#xff0c;但因Hive的離線大數據處理特性&#xff0c;存在一些特有規則和最佳實踐。以下是Hive SQL的編輯指南&#xff0c;涵蓋核心語法、注意事項和優化技巧&#xff1a; 一、H…

力扣熱題100--------240.搜索二維矩陣

編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target 。該矩陣具有以下特性&#xff1a; 每行的元素從左到右升序排列。 每列的元素從上到下升序排列。 示例 1&#xff1a;輸入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24…

【pytest高階】-2- 內置hook插件擴展機制和定制開發

一、可愛版 pytest 插件 & hook 知識大禮包 &#x1f381;準備好和 pytest 插件來一場可愛約會了嗎&#xff5e; 咱們用超甜的 emoji 把知識串成棉花糖&#x1f361; 一口一個知識點&#xff01;一、 pytest 插件&#xff1a;框架的 “魔法百寶箱” &#x1f9d9;?♀?1. …

博創軟件數智通OA平臺:高效協同,安全辦公新選擇

在數字化轉型浪潮下&#xff0c;企業對于辦公自動化系統的需求日益迫切。博創軟件&#xff0c;作為協同辦公領域的佼佼者&#xff0c;憑借其卓越的技術實力和豐富的行業經驗&#xff0c;推出了數智通OA平臺&#xff0c;為企業提供了一個高效、安全、便捷的辦公解決方案。博創軟…

AI coding匯總持續更新

代碼編輯器 當然了&#xff0c;用代碼編輯器這個概念太泛了&#xff0c;更多的是指AI代碼編輯器&#xff0c;有自動補全&#xff0c;ai寫代碼功能的產品。 cursor WindSurf Trae jetbrains全家桶 比如&#xff1a;IntelliJ IDEA雖然很優秀&#xff0c;但是有種感覺&#xff0c;…

Yolo底層原理學習--(第二篇)

一&#xff0c;IOU置信度與非極大值抑制NMS在第一篇文章中我們講到&#xff0c;對于一張圖片&#xff0c;在前向傳播的過程后&#xff08;也就是卷積&#xff0c;池化&#xff0c;全連接等等&#xff09;&#xff0c;會生成許許多多個預測框&#xff0c;那么怎么從這么多預測框…

國內短劇CSP系統開發:技術架構與合規實踐全解析

一、行業背景與政策驅動2025年&#xff0c;中國網絡微短劇行業迎來法治化轉型的關鍵期。國家廣播電視總局《關于進一步統籌發展和安全促進網絡微短劇行業健康繁榮發展的通知》明確實施"分類分層審核"制度&#xff0c;將微短劇劃分為重點微短劇&#xff08;投資≥100萬…

http請求訪問響應慢問題解決的基本思路

一、明確問題現象&#xff1a;先確定 “慢” 的特征在排查前&#xff0c;需先收集基礎信息&#xff0c;縮小問題范圍&#xff1a;是否所有請求都慢&#xff1f; 還是僅特定接口&#xff08;如帶數據庫操作的接口&#xff09;、特定時間段&#xff08;如高峰期&#xff09;、特定…

Vue.js的核心概念

Vue.js的核心概念可歸納為以下關鍵點&#xff0c;結合最新技術演進與實踐場景&#xff1a;一、響應式數據綁定?雙向綁定機制?&#xff1a;通過Object.defineProperty&#xff08;Vue 2&#xff09;或Proxy&#xff08;Vue 3&#xff09;實現數據劫持&#xff0c;自動追蹤依賴…

新手小白做一個簡單的微服務

我不太懂微服務框架&#xff0c;自己跟了個視頻嘗試做一套簡單的微服務框架&#xff0c;跟著做的時候&#xff0c;發現這個視頻很適合初學者 https://www.bilibili.com/video/BV1684y1T7oW/?spm_id_from333.337.search-card.all.click&vd_source61882010e50d6b158eb87c148…

C語言筆記4:錯題整理

#1.1 編程題 判斷101-500之間有多少個素數&#xff0c;放入數組中&#xff0c;遍歷數組輸出所有素數&#xff0c; 素數&#xff1a; 除了1和它本身以外不再有其他的因數。 具體實現 就用DeepSeek了 以下是AI生成代碼&#xff1a; #include <stdio.h> #include <math.h…

Mysql join語句

join 語句用于實現多表查詢。 Index Nested-Loop Join select * from a join b on a.idb.id。對于兩張表 a 和 b&#xff0c;Mysql 優化器會選擇其中一張表執行全表掃描&#xff0c;稱為驅動表。對于驅動表每一數據行&#xff0c;在被驅動表查詢數據&#xff0c;將結果組合返回…

Spring AI 系列之三十 - Spring AI Alibaba-其它模型

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

【Flutter3.8x】flutter從入門到實戰基礎教程(五):Material Icons圖標的使用

flutter給我們內置準備了很多圖標&#xff0c;這些圖標可以使我們在沒有設計師的前提下&#xff0c;也能做出自己滿意的app icon網站 https://material.io/tools/icons/進入網站后&#xff0c;點擊我們需要的圖標&#xff0c;然后滑動找到flutter的tab選項&#xff0c;就可以看…

算法訓練營day38 動態規劃⑥ 322. 零錢兌換、279.完全平方數、139.單詞拆分、多重背包

動態規劃的第六篇&#xff01;背包問題總結篇&#xff01; 322. 零錢兌換 題目中說每種硬幣的數量是無限的&#xff0c;可以看出是典型的完全背包問題。但是如何找最小的“組合”呢&#xff1f;&#xff08;通過dp數組的不同定義 與 遞推公式&#xff09; 確定dp數組以及下標的…

vue+element 實現下拉框共享options

背景 用戶的需求總是多樣的&#xff0c;這不用戶想做個下拉連選&#xff0c;每選一個基金&#xff0c;下方表格多一行&#xff0c;選擇對應的重要性&#xff0c;任務&#xff1b;問題 其他都好弄&#xff0c;任務是遠程搜索&#xff0c;選擇人的單選下拉&#xff0c;如果每個下…

centos服務器安裝minio

1.創建目錄和下載文件 #創建相關文件夾 mkdir -p /home/minio mkdir -p /home/minio/bin mkdir -p /home/minio/data#進入上面創建的bin目錄下 cd /home/minio/bin#下載minio&#xff08;最新版minio無法通過頁面的控制臺配置accesskey建議選擇2024年的版本操作&#xff09; ht…

【云故事探索】NO.16:阿里云彈性計算加速精準學 AI 教育普惠落地

智能精準學寒雪老師 X 阿里云彈性計算&#xff1a;以堅實算力底座&#xff0c;實現 AI 一對一教育普惠的愿景 【導語】 當全球首個 K12 教育超級智能體“寒雪老師”在深夜為萬千學子答疑解惑&#xff0c;支撐其流暢互動的&#xff0c;是阿里云彈性計算 15 年淬煉的堅實算力底座…

forge篇——配置

從這篇文章開始,我們開始研究forge代碼,以下是forge源代碼和代碼解析 ForgeConfigSpec 類詳細解析 ForgeConfigSpec 是 Minecraft Forge 模組開發中的核心配置類,基于 NightConfig 庫實現,提供了類型安全、驗證和自動糾正功能。以下是關鍵部分的詳細解釋: 1. 類定義與基…

全新發布|知影-API風險監測系統V3.3,AI賦能定義數據接口安全新坐標

7月31日&#xff0c;全知科技「知影-API風險監測系統V3.3」版本正式上線。在版本發布直播中&#xff0c;全知科技資深產品經理裴向南系統講解了V3.3版本的核心亮點、能力升級與后續產品規劃方向。作為全知科技自主研發的核心產品&#xff0c;「知影-API風險監測系統」自2017年起…