交換類排序的C語言實現

? ? ? ? 交換類排序包括冒泡排序和快速排序兩種。

冒泡排序

? ? ? ? 基本介紹

? ? ? ? 冒泡排序是通過重復比較相鄰元素并交換位置實現排序。其核心思想是每一輪遍歷將未排序序列中的最大(或最小)元素"浮動"到正確位置,類似氣泡上升。

? ? ? ? 基本過程是從序列起始位置開始,逐個比較相鄰的兩個元素,以升序為例,若左邊的元素大于右邊的元素則交換兩個元素的位置,每輪遍歷之后都會使一個最大元素移動到最右邊,在下一輪遍歷時就無需再考慮這個元素。

? ? ? ? 實現過程

? ? ? ? 以升序為例,從起始位置開始遍歷,2 < 5,無需交換,5 < 8,無需交換,8 > 3,需要交換。

? ? ? ? ?交換之后繼續比較8,6,8 > 6,需要交換

? ? ? ? ?交換之后繼續比較,8 < 9,無需交換,繼續比較,9 > 1,需要交換

? ? ? ? ?交換之后繼續比較,9 > 4,需要交換

? ? ? ? 交換之后繼續比較,9 > 7,需要交換?

? ? ? ? 最終完成一輪遍歷,將最大的元素移到了右邊,然后繼續后續遍歷,后續遍歷則不用再考慮9了,再找出一個最大值移到右邊,進行size - 1次遍歷即可完成排序。?

? ? ? ? 代碼展示

#include <stdio.h>int array[10] = {2,5,8,3,6,9,1,4,7};void sort(int *a,int len)
{//len個元素需要排序len - 1次for (int i = 0; i < len - 1; i++){//單輪循環可以找出來一個最大/最小并移到邊上,下一輪循環就不考慮該元素,len - 1次之后只剩下一個元素,無需排序for (int j = 0; j < len - i - 1; j++){if(a[j] > a[j + 1]){int tmp = a[j];a[j] = a[j + 1];a[j + 1] = tmp;}}//打印每輪排序的結果for (int j = 0; j < len; j++){printf("%d ",a[j]);}printf("\n");}}int main(int argc, char const *argv[])
{sort(array,9);return 0;
}

? ? ? ? 代碼優化?

????????如果在排序過程中,我們發現在某一次遍歷過程中都沒有發生元素交換,那么我們就可以認為序列已經排序完成,此時沒有必要遍歷size - 1次。遍歷size - 1次一定可以使序列有序,但是有些序列執行更少次數的遍歷就已經有序了。所以我們可以減少這些無意義的遍歷,設置一個標志位swap_flag來記錄遍歷過程中是否發生了交換,若無交換則提前結束排序。

#include <stdio.h>int array[10] = {2,5,8,3,6,9,1,4,7};void sort(int *a,int len)
{//len個元素需要排序len - 1次for (int i = 0; i < len - 1; i++){//記錄該輪循環是否發生了交換int swap_flag = 0;//單輪循環可以找出來一個最大/最小并移到邊上,下一輪循環就不考慮該元素,len - 1次之后只剩下一個元素,無需排序for (int j = 0; j < len - i - 1; j++){if(a[j] > a[j + 1]){int tmp = a[j];a[j] = a[j + 1];a[j + 1] = tmp;swap_flag = 1;}}//如果本輪循環沒有發生交換,則已經全部有序,跳出循環。if(swap_flag == 0)break;for (int j = 0; j < len; j++){printf("%d ",a[j]);}printf("\n");}}int main(int argc, char const *argv[])
{sort(array,9);return 0;
}

? ? ? ?優化效果對比

????????未經優化的冒泡排序運行結果如下,完整進行了8次(size - 1)遍歷。

? ? ? ? 經優化的冒泡排序運行結果如下,進行了7次遍歷,對于不同的序列,優化效果有所不同。運行結果僅打印了6次是因為break寫在了打印之前,排序完成之后的后一次遍歷才能檢測到排序已完成。

?快速排序

? ? ? ? 基本介紹

????????快速排序的思想是通過一個基準值,把一組數據分成兩個部分(一邊小,一邊大),然后,在對兩個部分,分別找一個基準值,再次進行排序,直至每一個小部分不可再分,所得到的整個數組就成為了有序數組。

? ? ? ? 快速排序的基本過程是先選擇一個數作為基準值 (這里用的是第一個數,key),進行一次排序,(以升序為例)然后將所有比'基準值小的數'放在基準值的'左邊', 將所有比'基準值大的數'放在基準值的'右邊',然后再對兩邊的,各自'再取一個數作為基準值',然后再次排序(遞歸[自己調自己])。

? ? ? ? 實現過程

? ? ? ? 定義兩個指示器,low和high,分別指向首尾。定義一個i,j分別指向low和high,用于遍歷。

? ? ? ? ?從 j 開始逐個向左開始和基準值相比較。7大于key,不移動,4 > key,不移動,1 < key,要移動到左邊。由于已經用key保存了基準值,所以放到左邊是可以直接在a[i]處賦值。

? ? ? ? 之后再從左邊開始,1 < key,不動,5 > key,需要移動到右邊,直接在右邊賦值為5即可。放在這里的原因是因為這里的元素已經在前面被移動到了其他位置,不用擔心數據丟失,而且下標位置也屬于右邊。

? ? ? ? 這樣完成一輪之后,發現一開始不符合規律的5已經移到了右邊,不符合規律的1已經移到了左邊。然后繼續移動指示器,尋找不符合規律的元素。從 j 處繼續,9 > key,不移動,6 > key,不移動,3 > key,不移動,8 > key,不移動,比較完8之后,發現 i 已經等于 j 了,此時結束,發現基準值應該插入到 i? 、 j 處,在i 、j 處插入基準值。

? ? ? ? ?然后我們發現,基準值2的左邊都比他小,右邊都比他大,就以基準值為界限,分為了兩部分。

????????然后再對左邊和右邊分別找基準值再進行排序,之后再對分成的兩部分排序,一直遞歸,直到不可再分為止。

????????遞歸最重要的是要找到終止條件,否則就會一直套娃,這里的終止條件是不可再分,不可再分具體表現在哪呢?在本例中,進行一輪之后,以2為界限分為左右兩部分,左邊部分是[low,i - 1],右邊部分是[i + 1,high],不可再分就代表只有一個元素,即low = i - 1,i + 1 = high時就是不可再分,再加上一個數學限制條件,low應該小于i - 1,所以最終的終止條件是low >= i-1和high <= i+1.

? ? ? ? ?代碼展示

#include <stdio.h>int array[10] = {2,5,8,3,6,9,1,4,7};void quick_sort(int *a,int low,int high)
{//定義兩端的下標int i = low,j = high;//選擇一個基準值,這里選擇第一個元素int key = a[i];//循環之后的結果是,比基準值小的都放在左邊,比基準值大的都放在右邊//同時i,j都在向中間靠近,當i = j時循環跳出,就找到了區分左右的邊界(i、j)//之后a[i] = key是將基準值放在中間的分界。//條件設置為i < j就是因為當i,j相遇時,即找到了分界線的位置(i、j),然后將基準值插入到這個位置上//外層循環一次的結果是將不屬于兩邊的元素互換(比如位于左邊但是沒有小于基準值)while (i < j){//從右邊開始,右邊的元素應比基準值大,尋找不符合的元素while (i < j && a[j] >= key)j--;//將不符合的元素放到左邊,直接覆蓋是因為://第一次循環,a[i]是基準值,已經用key保存,所以可以覆蓋//之后的循環,a[i]也是不符合條件的元素,已經在上一次循環中被移動,所以可以覆蓋a[i] = a[j];//從左邊開始,左邊的元素應比基準值小,尋找不符合的元素while (i < j && a[i] <= key)i++;//將不符合的元素放到右邊,直接覆蓋是因為a[j]的值已經在上邊被移動了。a[j] = a[i];}//循環結束,i,j相遇//上述循環中,由于基準值已經用key保存了,所以其所在位置充當了一個交換緩沖的角色,//a[i],a[j]的每次移動都讓自己之前的地方成為了下一個移動的目的地a[i] = key;//對基準值左右兩邊的元素再進行快排,直到無法再分//i,j的位置就是基準值,左邊就是[low,i - 1],右邊就是[i + 1,high]//不可再分的條件就是i - 1 和 low不滿足i - 1 > low,i + 1 和 high不滿足i + 1 < highif(i - 1 > low)quick_sort(a,low,i - 1);if(i + 1 < high)quick_sort(a,i + 1,high);
}int main(int argc, char const *argv[])
{quick_sort(array,0,8);for (int j = 0; j < 9; j++){printf("%d ",array[j]);}printf("\n");return 0;
}

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

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

相關文章

嵌入式 Linux開發環境構建之Source Insight 的安裝和使用

目錄 一、Source Insight 的安裝 二、Source Insight 使用 一、Source Insight 的安裝 這個軟件是代碼編輯和查看軟件&#xff0c;打開開發板光盤軟件&#xff0c;然后右鍵選擇以管理員身份運行這個安裝包。在彈出來的安裝向導里面點擊 next &#xff0c;如下圖所示。這里選擇…

【字節跳動】數據挖掘面試題0016:解釋AUC的定義,它解決了什么問題,優缺點是什么,并說出工業界如何計算AUC。

文章大綱 AUC(Area Under the Curve)詳解一、定義:AUC是什么?二、解決了什么問題?三、優缺點分析四、工業界大規模計算AUC的方法1. 標準計算(小數據)2. 工業級大規模計算方案3.工業界最佳實踐4.工業界方案選型建議總結:AUC的本質AUC(Area Under the Curve)詳解 一、…

Python后端項目之:我為什么使用pdm+uv

在試用了一段時間的uv和pdm之后&#xff0c;上個月(2025.06)開始&#xff0c;逐步把用了幾年的poetry替換成了pdmuv&#xff08;pipx install pdm uv && pdm config use_uv true) ## 為什么poetry -> pdm: 1. 通過ssh連接到服務器并使用poetry shell激活虛擬環境之…

鴻蒙Next開發,配置Navigation的Route

1. 通過router_map.json配置文件進行 創建頁面配置router_map.json {"routerMap": [{"name": "StateExamplePage","pageSourceFile": "src/main/ets/pages/state/StateExamplePage.ets","buildFunction": "P…

在 GitHub 上創建私有倉庫

一、在 GitHub 上創建私有倉庫打開 GitHub官網 并登錄。點擊右上角的 “” → 選擇 “New repository”。填寫以下內容&#xff1a; Repository name&#xff1a;倉庫名稱&#xff0c;例如 my-private-repo。Description&#xff1a;可選&#xff0c;倉庫描述。Visibility&…

量產技巧之RK3588 Android12默認移除導航欄狀態欄?

本文介紹使用源碼編譯默認去掉導航欄/狀態欄方法,以觸覺智能EVB3588開發板演示&#xff0c;Android12系統&#xff0c;搭載了瑞芯微RK3588芯片&#xff0c;該開發板是核心板加底板設計&#xff0c;音視頻接口、通信接口等各類接口一應俱全&#xff0c;可幫助企業提高產品開發效…

Conda 安裝與配置詳解及常見問題解決

《Conda 安裝與配置詳解及常見問題解決》 安裝 Conda 有兩種主流方式&#xff0c;分別是安裝 Miniconda&#xff08;輕量級&#xff09;和 Anaconda&#xff08;包含常用數據科學包&#xff09;。下面為你詳細介紹安裝步驟和注意要點。 一、安裝 Miniconda&#xff08;推薦&a…

Linux ——lastb定時備份清理

lastb 命令顯示的是系統中 /var/log/btmp 文件中的SSH 登錄失敗記錄。你可以像處理 wtmp 那樣&#xff0c;對 btmp 文件進行備份與清理。? 一、備份 lastb 數據cp /var/log/btmp /var/log/btmp.backup.$(date %F)會保存為如 /var/log/btmp.backup.2025-07-14? 二、清空 lastb…

自定義類型 - 聯合體與枚舉(百度筆試題算法優化)

目錄一、聯合體1.1 聯合體類型的聲明1.2 聯合體的特點1.3 相同成員的結構體和聯合體對比1.4 聯合體大小的計算1.5 聯合練習二、枚舉類型2.1 枚舉類型的聲明2.2 枚舉類型的優點總結一、聯合體 1.1 聯合體類型的聲明 像結構體一樣&#xff0c;聯合體也是由一個或者多個成員構成…

FS820R08A6P2LB——英飛凌高性能IGBT模塊,驅動高效能源未來!

產品概述FS820R08A6P2LB 是英飛凌&#xff08;Infineon&#xff09;推出的一款高性能、高可靠性IGBT功率模塊&#xff0c;采用先進的EconoDUAL? 3封裝&#xff0c;專為大功率工業應用設計。該模塊集成了IGBT&#xff08;絕緣柵雙極型晶體管&#xff09;和二極管&#xff0c;適…

python學智能算法(十八)|SVM基礎概念-向量點積

引言 前序學習進程中&#xff0c;已經對向量的基礎定義有所了解&#xff0c;已經知曉了向量的值和方向向量的定義&#xff0c;學習鏈接如下&#xff1a; 向量的值和方向 在此基礎上&#xff0c;本文進一步學習向量點積。 向量點積 向量點積運算規則&#xff0c;我們在中學階…

【windows辦公小助手】比文檔編輯器更好用的Notepad++輕量編輯器

Notepad 中文版軟件下載&#xff1a;這個路徑總是顯示有百度無法下載&#xff0c;不推薦 更新&#xff1a;推薦下載路徑 https://github.com/notepad-plus-plus/notepad-plus-plus/releases 參考博主&#xff1a;Notepad的安裝與使用

2025年7月12日全國青少年信息素養大賽圖形化(Scratch)編程小學高年級組復賽真題+答案解析

2025年7月12日全國青少年信息素養大賽圖形化(Scratch)編程小學高年級組復賽真題+答案解析 選擇題 題目一 運行如圖所示的程序,舞臺上一共會出現多少只小貓呢?( ) A. 5 B. 6 C. 7 D. 8 正確答案: B 答案解析: 程序中“當綠旗被點擊”后,角色先移到指定位置,然后“重…

對于獨熱編碼余弦相似度結果為0和詞向量解決了詞之間相似性問題的理解

文章目錄深入理解簡單案例結論詞向量&#xff08;Word Embedding&#xff09;簡介詞向量如何解決相似性問題&#xff1f;簡單案例&#xff1a;基于上下文的詞向量訓練總結對于獨熱表示的向量&#xff0c;如果采用余弦相似度計算向量間的相似度&#xff0c;可以明顯的發現任意兩…

數據結構·數狀數組(BIT)

樹狀數組(Binary Index Tree) 英文名&#xff1a;使用二進制下標的樹結構 理解&#xff1a;這個樹實際上用數組來存&#xff0c;二進制下標就是將正常的下標拆為二進制來看。 求x的最低位1的函數lowbit&#xff08;x&#xff09; 假設x的二進制表示為x ...10000&#xff0c;…

uniapp video視頻全屏播放后退出,頁面字體變大,樣式混亂問題

uniapp官方的說法是因為頁面使用rpx&#xff0c;但是全屏和退出全屏自動計算屏幕尺寸不支持rpx&#xff0c;建議使用px。但是因為uniapp端的開發都是使用rpx作為屏幕尺寸計算參數&#xff0c;不可能因為video全屏播放功能就整個全部修改&#xff0c;工作量大&#xff0c;耗時耗…

重復頻率較高的廣告為何一直在被使用?

在日常生活中&#xff0c;重復評率較高的洗腦廣告我們時常能夠碰到。廣告的本質是信息傳遞&#xff0c;而重復頻率較高的廣告往往可以通過洗腦式的傳播方式來提升傳播效率。下面就讓我們一同來了解下&#xff0c;為何這類廣告一直受到企業的青睞。一、語義凝練高頻率廣告的內容…

內容管理系統指南:企業內容運營的核心引擎

內容管理看似簡單&#xff0c;實際上隨著內容量的激增&#xff0c;管理難度也逐步提升。尤其是在面對大量頁面、圖文、視頻資料等數字內容時&#xff0c;沒有專業工具的支持&#xff0c;效率與準確性都會受到挑戰。此時&#xff0c;內容管理系統&#xff08;CMS&#xff09;應運…

文獻查找任務及其方法

1. 必備網站&#xff1a; 谷歌學術 Web of Science Engineering Village CNKI翻譯助手 科研通 2. 任務 學術上的一個調研&#xff0c;自動駕駛 3d 目標檢測 方向的近7年的方法&#xff0c;模態&#xff08;相機/雷達/相機雷達 等&#xff09;&#xff0c;及其使用的數據集&a…

鴻蒙的NDK開發初級入門篇

初級必備的知識&#xff1a; NDK開發在什么時候用&#xff1f; 答&#xff1a;&#xff1a;NDK 開發在幫助應用提升性能的情況下使用&#xff0c;比如游戲開發&#xff0c;和硬件交互的場景中。 還有一個公司已經有標準的C或C庫&#xff0c;不想在開發ArkTS的代碼前提下。 開發…