排序算法實現:插入排序與希爾排序

目錄

一、引言?

二、代碼整體結構?

三、宏定義與頭文件?

四、插入排序函數(Insertsort)

函數作用?

代碼要點分析?

五、希爾排序函數(ShellSort)?

函數作用?

代碼要點分析?

六、打印數組函數(PrintSort)?

?函數作用?

代碼要點分析?

七、測試函數(TestSort)與主函數(main)?

?函數作用?

代碼要點分析?

八、總結?


一、引言
?


在計算機科學領域,排序算法是非常基礎且重要的內容。不同的排序算法有著各自的特點和適用場景。本文將基于給定的C語言代碼,深入剖析插入排序(Insertion Sort)和希爾排序(Shell Sort)的實現過程,幫助讀者更好地理解這兩種排序算法的原理與應用。

?

作者主頁:共享家9527-CSDN博客
二、代碼整體結構
?


代碼主要包含了插入排序函數、希爾排序函數、打印數組函數以及測試函數和主函數,整體結構清晰,便于理解和維護。下面我們對每個函數進行詳細分析。


三、宏定義與頭文件
?


c#define _CRT_SECURE_NO_WARNINGS
#include"Sort.h"


?
?#define _CRT_SECURE_NO_WARNINGS??這一宏定義的作用是在使用一些被認為可能存在安全風險的C標準庫函數(如?scanf?、?strcpy?等)時,避免編譯器產生警告信息。?#include"Sort.h"??表示包含自定義的頭文件?Sort.h?,雖然在給出的代碼中未看到該頭文件的具體內容,但通常它會包含一些函數聲明、類型定義等內容,方便代碼的模塊化管理。


四、插入排序函數(Insertsort)


c//插排
void Insertsort(int* a, int n){for (int i = 1;i < n;i++){int end = i - 1;int temp = a[i];while (end >= 0){if (temp < a[end]){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = temp;}
}


函數作用
?


插入排序函數的功能是對給定的整數數組進行排序,排序的基本思想是將一個數據插入到已經排好序的數組中的適當位置。
?


代碼要點分析
?


1.?外層循環:?for (int i = 1;i < n;i++)??從數組的第二個元素開始(因為第一個元素可以看作是已經排好序的子數組),依次將每個元素插入到前面已排序的子數組中的合適位置。
?
2.?初始化變量:?int end = i - 1;??定義?end?變量表示已排序子數組的最后一個元素的下標。?int temp = a[i];??將當前待插入的元素暫存到?temp?變量中。
?
3.?內層循環:?while (end >= 0)??當?end?大于等于0時,繼續循環,即只要還在已排序的子數組范圍內,就進行比較和移動操作。?if (temp < a[end])??如果待插入元素小于當前已排序子數組的最后一個元素,則將該元素向后移動一位,同時?end?減1,繼續向前比較。當遇到不滿足該條件的元素時,說明找到了待插入元素的合適位置,通過?break?跳出循環。
?
4.?插入操作:?a[end + 1] = temp;??將暫存的待插入元素插入到合適的位置。
?


五、希爾排序函數(ShellSort)


c//希爾
void ShellSort(int* a, int n)
{int gap = 9;while (gap > 0){gap /= 2;for (int j = 0;j < gap;j++){for (int i = j;i < n - gap;i += gap){int end = i;int temp = a[i + gap];while (end >= 0){if (temp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = temp;}}}
}


?


函數作用
?


希爾排序是插入排序的一種改進版本,通過將數組按照一定的間隔(?gap?)進行分組,對每組分別進行插入排序,隨著間隔逐漸減小,最終完成整個數組的排序。
?


代碼要點分析
?


1.?初始間隔設置:?int gap = 9;??定義初始的分組間隔,這里設置為9,不同的初始間隔可能會影響排序的效率。
?
2.?間隔調整循環:?while (gap > 0)??當間隔大于0時,繼續進行排序操作。每次循環中,?gap /= 2;??將間隔逐漸縮小,直到間隔為1時,相當于進行一次普通的插入排序。
?
3.?分組循環:?for (int j = 0;j < gap;j++)??對每個分組進行遍歷,確保每個分組都能進行插入排序操作。
?
4.?組內插入排序循環:?for (int i = j;i < n - gap;i += gap)??對每個分組內的元素進行插入排序,類似于插入排序的過程,但這里元素之間的比較和移動是按照間隔?gap?進行的。
?
5.?插入操作:與插入排序類似,通過比較和移動元素,將當前元素插入到分組內合適的位置。
?


六、打印數組函數(PrintSort)
?


cvoid PrintSort(int* a, int n)
{for (int i = 0;i < n;i++){printf("%d ",a[i]);}printf("\n");
}


?
函數作用
?


該函數的功能是將給定的整數數組按照順序打印輸出,方便查看數組在排序前后的狀態。
?


代碼要點分析
?


通過一個簡單的?for?循環遍歷數組,使用?printf?函數逐個輸出數組元素,并在最后換行,使輸出結果更加清晰易讀。
?


七、測試函數(TestSort)與主函數(main)
?


cvoid TestSort()
{int arr[] = { 9,5,1,3,7,8,4,2,6,0 };int n = sizeof(arr) / sizeof(arr[0]);PrintSort(arr, n);Insertsort(arr, n);//ShellSort(arr, n);PrintSort(arr, n);
}int main()
{TestSort();return 0;
}


?
函數作用
?


?TestSort?函數用于測試排序算法的正確性,在函數內部創建一個測試數組,先打印數組的初始狀態,然后調用插入排序函數對數組進行排序,再次打印排序后的數組狀態。?main?函數則是程序的入口,調用?TestSort?函數來執行測試。
?


代碼要點分析
?


1.?在?TestSort?函數中,?int arr[] = { 9,5,1,3,7,8,4,2,6,0 };??創建一個包含10個整數的測試數組。?int n = sizeof(arr) / sizeof(arr[0]);??計算數組的元素個數。
?
2.?調用?PrintSort?函數打印數組初始狀態,然后調用?Insertsort?函數進行排序,注釋掉的?ShellSort(arr, n);??表示如果需要測試希爾排序,可取消注釋。最后再次調用?PrintSort?函數打印排序后的數組。
?
3.??main?函數中僅調用?TestSort?函數,程序從這里開始執行。
?


八、總結


通過對上述代碼的詳細分析,我們深入了解了插入排序和希爾排序的實現過程。插入排序簡單直觀,適用于小規模數據的排序;希爾排序作為插入排序的改進算法,通過分組和逐漸縮小間隔的方式,提高了排序效率,尤其在處理大規模數據時表現更為出色。在實際應用中,我們可以根據數據的特點和規模,選擇合適的排序算法來滿足需求。

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

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

相關文章

redis的key是如何找到對應存儲的數據原理

在 Redis 中,Key 是數據的唯一標識符,而 Value 是與 Key 關聯的實際數據。Redis 通過高效的鍵值對存儲機制,能夠快速定位和訪問數據。以下是 Redis 如何通過 Key 找到對應存儲數據的詳細解析: 1. Redis 的數據存儲結構 Redis 是一個基于內存的鍵值存儲系統,其核心數據結構…

github上傳本地文件到遠程倉庫(空倉庫/已有文件的倉庫)

今天搞自己本地訓練的代碼到倉庫留個檔&#xff0c;結果遇到了好多問題&#xff0c;到騰了半天才搞明白整個過程&#xff0c;留在這里記錄一下。 遠程空倉庫 主要根據官方教程&#xff1a;Adding locally hosted code to GitHub - GitHub Docs #1. cd到你需要上傳的文件夾&a…

Redis數據類型詳解

Redis數據類型詳解 Redis 共有 5 種基本數據類型&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#xff08;集合&#xff09;、Hash&#xff08;散列&#xff09;、Zset&#xff08;有序集合&#xff09;。 除了 5 種基本的數據…

【第13章】億級電商平臺訂單系統-高性能之異步架構設計

1-1 本章導學 課程導學 學習目標:掌握大型系統架構設計難點之高性能異步架構設計項目落地:訂單系統高性能異步架構設計(年交易200億B2B電商平臺)本章主要內容 1. 為何需要異步消息架構 分析同步架構的性能瓶頸異步架構對系統解耦與性能提升的核心價值2. 確定異步消息技術…

2025-03-20 學習記錄--C/C++-C 庫函數 - toupper()、tolower()、 isspace()

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、C 庫函數 - toupper() ?? C 標準庫 - <ctype.h> C 標準庫的 ctype.h 頭文件提供了一些函數&#xff0c;可用于測試和…

LoRaWAN技術解析

LoRaWAN&#xff08;Long Range Wide Area Network&#xff09;是一種基于 LoRa&#xff08;Long Range&#xff09;技術的低功耗廣域網絡協議&#xff0c;專為物聯網&#xff08;IoT&#xff09;設備的無線通信而設計。它是一種開放的、標準化的通信協議&#xff0c;支持大規模…

織夢DedeCMS如何獲得在列表和文章頁獲得頂級或上級欄目名稱

獲得頂級或二級欄目的名稱&#xff0c;都需要修改php文件&#xff0c;修改的文件【/include/common.func.php】將代碼插入到這個文件的最下面即可&#xff1b; 一、獲得當前文章或欄目的【頂級欄目】名稱 1、插入頂級欄目代段 //獲取頂級欄目名 function GetTopTypename($id…

虛幻基礎:ue自定義類

文章目錄 Gameplay Tag&#xff1a;ue標簽類創建&#xff1a;其他-數據表格-gameplaytag安裝&#xff1a;項目設置&#xff1a;gamePlayTag&#xff1a;gamePlay標簽列表使用&#xff1a;變量類型&#xff1a;gamePlayTag primary data asset&#xff1a;ue數據類&#xff1a;通…

易語言模擬真人鼠標軌跡算法

一.簡介 鼠標軌跡算法是一種模擬人類鼠標操作的程序&#xff0c;它能夠模擬出自然而真實的鼠標移動路徑。 鼠標軌跡算法的底層實現采用C/C語言&#xff0c;原因在于C/C提供了高性能的執行能力和直接訪問操作系統底層資源的能力。 鼠標軌跡算法具有以下優勢&#xff1a; 模擬…

Matplotlib 柱形圖

Matplotlib 柱形圖 引言 在數據可視化領域&#xff0c;柱形圖是一種非常常見且強大的圖表類型。它能夠幫助我們直觀地比較不同類別或組之間的數據大小。Matplotlib&#xff0c;作為Python中最受歡迎的數據可視化庫之一&#xff0c;提供了豐富的繪圖功能&#xff0c;其中包括創…

sparksql的Transformation與 Action操作

Transformation操作 與RDD類似的操作 map、filter、flatMap、mapPartitions、sample、 randomSplit、 limit、 distinct、dropDuplicates、describe&#xff0c;而以上這些都是企業中比較常用的&#xff0c;這里在一個文件中統一論述 val df1 spark.read.json("src/m…

微軟Data Formulator:用AI重塑數據可視化的未來

在數據驅動的時代,如何快速將復雜數據轉化為直觀的圖表是每個分析師面臨的挑戰。微軟研究院推出的開源工具 Data Formulator,通過結合AI與交互式界面,重新定義了數據可視化的工作流。本文將深入解析這一工具的核心功能、安裝方法及使用技巧,助你輕松駕馭數據之美。 一、Dat…

20分鐘上手DeepSeek開發:SpringBoot + Vue2快速構建AI對話系統

20分鐘上手DeepSeek開發&#xff1a;SpringBoot Vue2快速構建AI對話系統 前言 在生成式AI技術蓬勃發展的今天&#xff0c;大語言模型已成為企業智能化轉型和個人效率提升的核心驅動力。作為國產大模型的優秀代表&#xff0c;DeepSeek憑借其卓越的中文語義理解能力和開發者友…

神經網絡中層與層之間的關聯

目錄 1. 層與層之間的核心關聯&#xff1a;數據流動與參數傳遞 1.1 數據流動&#xff08;Forward Propagation&#xff09; 1.2 參數傳遞&#xff08;Backward Propagation&#xff09; 2. 常見層與層之間的關聯模式 2.1 典型全連接網絡&#xff08;如手寫數字分類&#xf…

本地部署deepseek-r1建立向量知識庫和知識庫檢索實踐【代碼】

目錄 一、本地部署DS 二、建立本地知識庫 1.安裝python和必要的庫 2.設置主目錄工作區 3.編寫文檔解析腳本 4.構建向量數據庫 三、基于DS,使用本地知識庫檢索 本地部署DS,其實非常簡單,我寫了一篇操作記錄,我終于本地部署了DeepSeek-R1(圖文全過程)-CSDN博客 安裝…

String、StringBuffer、StringBuiler的區別

可變性 String是不可變的&#xff0c;這是因為String內部用于存儲數據的char[]數組用了final關鍵字修飾&#xff0c;而且是private的&#xff0c;并且沒有對外提供修改數組的方法。 StringBuffer和StringBuilder是可變的&#xff0c;它們內部的char數組沒有用final關鍵字修飾。…

Certd自動化申請和部署SSL證書并配置https

服務器使用的華為云&#xff0c;之前SSL證書通過配置Cloudflare的DNS實現的&#xff0c;最近華為云備案提示需修改解析至境內華為云IP&#xff0c;若解析境外IP&#xff0c;域名無需備案&#xff0c;需注銷或取消接入備案信息&#xff0c;改為使用Certd自搭建證書管理工具&…

git tag以及git

git tag 以及git 一、先說收獲吧 1. git bash 在windows上 類似于linux的bash提供的shell命令行窗口&#xff0c;可以執行很多linux命令&#xff0c;cd pwd ls vim cat touch mkdir&#xff0c;還可以用正則匹配查看標簽。相當于在windows上裝了一個小的linux。git init myproj…

ESP8266通過AT指令配置雙向透傳

一、固件燒錄 IO0接地后上電&#xff0c;進入燒錄模式&#xff0c;燒錄完成后去掉即可 二、參數配置 1、服務器端 ATCWMODE_DEF2 ATCWSAP_DEF"ESP8266","12345678",5,3 ATSAVETRANSLINK1,"192.168.4.2",9090,"UDP",8080 2、客戶端…

【3D模型】【游戲開發】【Blender】Blender模型分享-獅頭木雕附導入方法

導入方法&#xff1a; [Blender] 如何導入包含紋理的 .blend 模型文件 在 3D 建模和渲染工作中&#xff0c;Blender 是一款功能強大的免費開源軟件。很多時候&#xff0c;我們需要導入 .blend 后綴的模型文件&#xff0c;同時確保紋理&#xff08;textures&#xff09;文件夾…