C語言實現插入排序

什么是插入排序?

插入排序(Insertion Sort) 是一種簡單且逐步構建有序序列的排序算法。它的思想是將數組分為兩部分:已排序的部分和未排序的部分。初始時,已排序部分只包含數組的第一個元素,然后逐步將未排序部分的元素插入到已排序部分的正確位置,直到整個數組有序為止。

插入排序的詳細步驟

1、從數組的第二個元素開始,將其視為待插入的元素。
2、將待插入元素與已排序部分的元素進行比較,從已排序部分的末尾開始。
3、如果待插入元素小于已排序部分的某個元素,則將該元素向右移動一位,為待插入元素騰出插入位置。
4、重復步驟 3,直到找到待插入元素的正確位置。
5、將待插入元素插入到正確的位置。
6、重復步驟 2 到 5,直到將所有元素插入到已排序部分。

舉例說明

假設我們有以下待排序的數組:[5, 2, 9, 1, 5, 6]。

第一輪: 將數組中的第一個元素(5)視為已排序部分,然后將下一個元素(2)插入到已排序部分的正確位置。
排序后數組:[2, 5, 9, 1, 5, 6]

第二輪: 將數組中的第一個和第二個元素(2, 5)視為已排序部分,然后將下一個元素(9)插入到已排序部分的正確位置。
排序后數組:[2, 5, 9, 1, 5, 6]

第三輪: 將數組中的前三個元素(2, 5, 9)視為已排序部分,然后將下一個元素(1)插入到已排序部分的正確位置。
排序后數組:[1, 2, 5, 9, 5, 6]

第四輪: 將數組中的前四個元素(1, 2, 5, 9)視為已排序部分,然后將下一個元素(5)插入到已排序部分的正確位置。
排序后數組:[1, 2, 5, 5, 9, 6]

第五輪: 將數組中的前五個元素(1, 2, 5, 5, 9)視為已排序部分,然后將下一個元素(6)插入到已排序部分的正確位置。
排序后數組:[1, 2, 5, 5, 6, 9]

最終,整個數組變得有序:[1, 2, 5, 5, 6, 9]。

示例代碼

#include <stdio.h>void InsertionSortFor(int arr[], int length);void InsertionSortWhile(int arr[], int length);void PrintArray(int arr[], int length);int main()
{int arr[] = {5, 2, 9, 1, 5, 6};/*不可以放在函數內部,當數組作為函數參數傳遞給函數時,數組參數會被轉換為指針類型,因此在函數內部無法通過sizeof操作符獲取數組的長度。*/int length = sizeof(arr) / sizeof(arr[0]);printf("原始數組:");PrintArray(arr, length);InsertionSortFor(arr, length);printf("排序后的數組:");PrintArray(arr, length);return 0;
}void InsertionSortFor(int arr[], int length)
{int i, j, key;for (i = 1; i < length; i++){key = arr[i];// 從當前位置向前遍歷已排序的子數組,找到合適的插入位置for (j = i - 1; j >= 0 && arr[j] > key; j--){arr[j + 1] = arr[j]; // 向右移動元素}arr[j + 1] = key; // 插入元素到正確位置}
}void InsertionSortWhile(int arr[], int length)
{int i, j, key;for (i = 1; i < length; i++){key = arr[i];j = i - 1;// 將比 key 大的元素向右移動while (j >= 0 && arr[j] > key){arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}
}void PrintArray(int arr[], int length)
{int i;for (i = 0; i < length; i++){printf("%d ", arr[i]);}printf("\n");
}

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

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

相關文章

Process.Start 報錯

Process.Start 報錯 System.Diagnostics.Process.StartWithShellExecuteEx Process.Start 為什么會引發“系統找不到指定的文件”異常 Process.Start 報錯 找不到路徑 ,System.ComponentModel.Win32Exception:“系統找不到指定的文件。 問題1、 在WinForm中可能是權限問題&…

做了這件事,精準拿捏企業資產管理!

資產管理系統是一種為組織和個人提供管理各類資產的重要工具。無論是金融資產還是實物資產&#xff0c;這些都構成了一個實體或個人財務狀況的重要組成部分。 無論是企業尋求優化其固定資產維護&#xff0c;還是個人希望更好地管理他們的投資組合&#xff0c;資產管理系統在現代…

NZ系列工具NZ02:VBA讀取PDF使用說明

【分享成果&#xff0c;隨喜正能量】時光綻放并蒂蓮&#xff0c;更是一份殷殷囑托&#xff0c;更是一份誠摯祝福&#xff0c;是一份時光饋贈&#xff0c;又是一份時光陪伴。。 我的教程一共九套及VBA漢英手冊一部&#xff0c;分為初級、中級、高級三大部分。是對VBA的系統講解…

“深入解析JVM:探索Java虛擬機的工作原理與優化技巧“

標題&#xff1a;深入解析JVM&#xff1a;探索Java虛擬機的工作原理與優化技巧 摘要&#xff1a;本文將深入探討Java虛擬機&#xff08;JVM&#xff09;的工作原理、內部結構以及如何優化Java應用程序的性能。我們將介紹JVM的主要組件&#xff0c;包括類加載器、運行時數據區域…

關于openssl SM2 ECC以及密鑰生成和簽名驗簽

SM2是基于ECC的國密算法,本身也是ECC算法。 openssl生成ECC公私鑰并簽名驗簽 #!/bin/sh openssl ecparam -genkey -name prime256v1 -out private.pem #print pri #openssl ec -in private.pem -text -noout openssl ec -in private.pem -pubout -out public.pem #gen test.…

uniapp+uview封裝小程序請求

提要&#xff1a; uniapp項目引入uview庫 此步驟不再闡述 1.創建環境文件 env.js&#xff1a; let BASE_URL;if (process.env.NODE_ENV development) {// 開發環境BASE_URL 請求地址; } else {// 生產環境BASE_URL 請求地址; }export default BASE_URL; 2.創建請求文件 該…

QLExpress動態腳本引擎解析工具

介紹 QLExpress腳本引擎 1、線程安全&#xff0c;引擎運算過程中的產生的臨時變量都是threadlocal類型。 2、高效執行&#xff0c;比較耗時的腳本編譯過程可以緩存在本地機器&#xff0c;運行時的臨時變量創建采用了緩沖池的技術&#xff0c;和groovy性能相當。 3、弱類型腳本…

廣西Geotrust單位多域名https證書推薦

Geotrust是國際知名CA認證機構&#xff0c;根證書是Digicert&#xff0c;還有RapidSSL、QuickSSL等子品牌&#xff0c;擁有多種類型的多域名https證書&#xff0c;比如OV企業型https證書和EV增強型多域名https證書。那么&#xff0c;哪種多域名https證書更適合企事業單位使用呢…

SpringBoot復習:(43)如何以war包的形式運行SpringBoot程序

一、.pom.xml配置packging為war <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven…

Android 內存泄漏

名詞解釋 內存泄漏:即memory leak。是指內存空間使用完畢后無法被釋放的現象&#xff0c;雖然Java有垃圾回收機制&#xff08;GC&#xff09;&#xff0c;但是對于還保持著引用&#xff0c; 該內存不能再被分配使用&#xff0c;邏輯上卻已經不會再用到的對象&#xff0c;垃圾回…

react如何實現數據渲染

React數據渲染是指將組件中的數據映射到頁面上&#xff0c;以展示出來。在React中&#xff0c;數據渲染通常是通過JSX和組件的state或props完成的。 JSX是一個類似HTML的語法&#xff0c;可以在其中嵌入JavaScript表達式。在JSX中&#xff0c;可以使用{}包裹JavaScript表達式&…

解決C語言中使用scanf輸入字符串導致for循環失效的問題

在C語言編程中&#xff0c;使用scanf函數輸入字符串是一項基本操作。然而&#xff0c;當我們嘗試在for循環中使用scanf輸入字符串時&#xff0c;可能會遇到意外的問題&#xff0c;導致循環無法正常執行。本文將深入探討這個問題&#xff0c;并提供解決方案&#xff0c;讓你能夠…

考公-判斷推理-定義判斷

第九節課 例題 例題 例題 例題 例題 例題 腳一滑&#xff0c;就是工傷&#xff0c;這難道不是操作不當嗎 例題 不要較真&#xff0c;公務員&#xff0c;把沒有全局觀念的人排除在公務員隊伍之外 例題 例題 下次看到不字&#xff0c;先給我畫上 例題 例題 例題 例題…

微信群聊微信機器人實現流程

1.注冊微信賬號 要使用一個微信機器人賬號來實現在微信群聊中的自動回復功能&#xff0c;你需要注冊一個專門用于機器人的微信賬號。 注冊微信機器人賬號的步驟如下&#xff1a; 下載微信&#xff1a;在手機或者電腦上下載并安裝微信應用程序。創建新賬號&#xff1a;打開微信…

力扣63.不同路徑II(動態規劃)

/*** author Limg* date 2022/08/09* 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。* 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish”&#xff09;。* 現在考慮網…

探討uniapp的生命周期問題

在uniapp中,生命周期函數分為應用生命周期函數、頁面生命周期函數和組件生命周期函數. 1應用聲明周期 應用生命周期函數只能在 App.vue 中監聽有效&#xff0c;在其他頁監聽無效。 onLaunch&#xff1a;當uni-app 初始化完成時觸發&#xff08;全局只觸發一次&#xff09;on…

鄉村振興指數與其30余個原始變量數據(2000-2022年)

鄉村振興是當下經濟學研究的熱點之一&#xff0c;對鄉村振興進行測度&#xff0c;是研究基礎。測度鄉村振興水平的學術論文廣泛發表在《數量經濟技術經濟研究》等頂刊上。整理了2000-2022年城市層面的鄉村振興指數與其30余個原始變量數據&#xff0c;供大家使用。 數據來源&…

react-spring,一個react的動畫庫的使用

介紹 React Spring 是一個 spring physics based animation library 用于 React。它可以輕松地在 React 中實現彈性、漸變等動畫效果。 使用 安裝依賴&#xff1a; 使用npm&#xff1a; npm install react-spring 使用yarn&#xff1a; yarn add react-spring 導入和使用&a…

Opencv4基于C++基礎入門筆記:OpenCV環境配置搭建

文章目錄&#xff1a; 一&#xff1a;軟件安裝 二&#xff1a;配置環境&#xff08;配置完之后重啟一下軟件&#xff09; 1.配置電腦系統環境變量 vs2012及其以下 vs2014及其以上 2.配置VS軟件環境變量 vs2012及其以下 vs2014及其以上 三&#xff1a;測試 vs2012及其…

Java 實現Rtsp 轉rtmp,hls,flv

服務支撐&#xff1a;FFmpeg srs(流媒體服務器) 整個流程是 FFmpeg 收流轉碼 推 rtmp 到流媒體服務 流媒體服務再 分發流到公網 搭建流媒體服務: 1. SRS (Simple Realtime Server) | SRS &#xff08;本例子使用的是SrS 安裝使用docker &#xff09; 2.GitHub - ZLMedi…