C語言中你必須知道的幾大排序演算法
在實際使用陣列的過程中,陣列不僅可以儲存多個同型別的資料,而且要求這些資料按照某種特徵進行排序。例如,學生的成績,需要按照從高到低的順序排列,這就需要使用排序演算法。
今天介紹幾種簡單的排序演算法:選擇排序,氣泡排序,交換法排序,。快速演算法到時另外單獨分享,涉及到遞迴函式這塊,有點小複雜
首先,第一步,先碼好標頭檔案
#include.h>
#include.h>
先來定義一個輸出函式,傳入陣列的首地址
第一種 選擇法排序(同樣封裝成函式,傳入陣列首地址)
每次共帶排序陣列中選擇一個最小值的陣列元素(若從大到小的順序,每次選擇最大值的陣列元素)
將這個陣列元素的值與最前面還未排序的陣列元素的值進行交換,直到整個陣列都是已排序的陣列元素為止
程式定義了兩個迴圈變數 i , j,作為陣列元素的下標;定義了一個整型陣列a,它包整型含10個元素,定義了一個整型temp,用來作為變數交換的中間值;定義一個整型k,用來記錄每輪選擇排序時當前最小值的下標
外層for迴圈用來表示排序的輪數,內層for迴圈對當前某輪剩餘未排序元素進行選擇排序。每輪排序開始時,都將當前未排好序的小標i 賦給k。接下來遍歷剩下的所有未排序的第一個元素,若當前元素的值小於下標為 k 的元素值,則將k的值賦值給當前元素的下標值,即k始終是遍歷到的所有元素當中最小值的下標。
在本輪迴圈結束後,將k與每輪初值i比較,如果k不等於i ,則表示剩餘所有元素的最小值元素下標不是 i 。這時需要將下標為 i 的元素值與最小值進行交換。
當外層for迴圈的每輪選擇迴圈體執行完畢後,i 下標的元素就是所有剩餘元素中的最小值。當for外層迴圈執行完畢後,排序完成,輸出排序後的陣列元素。
注意:經過了N-1輪選擇,就可以完成N個元素的陣列排序,即前N-1個元素已經排序,最後一個元素肯定就是最大值,不用再排序了。
小編給大家推薦一個學習氛圍超好的地方,C/C++交流企鵝裙:870963251!適合在校大學生,小白,想轉行,想通過這個找工作的加入。裙裡有大量學習資料,有大神解答交流問題,每晚都有免費的直播課程
第二種:冒泡法排序
每次比較陣列中相鄰兩個陣列元素的值,將較小的數排在較大的數前面(按從小到大的順序),每一輪排序後,都有一個最小
的數放在所有未排序的數前面。從後往前逐個比較相鄰兩個數字
程式定義了兩個迴圈變數 i , j,作為陣列元素的下標;定義了一個整型陣列a,它包整型含10個元素,定義了一個整型temp,用來作為變數交換的中間值;定義了一個整型變數flag,用來記錄每輪迴圈是否發生交換,以此判斷排序是否完成。
外層for迴圈用來表示排序的輪數,內層for迴圈對當前某輪剩餘未排序元素進行氣泡排序。
每輪開始時,首先設定flag的初值為0,然後從後往前以此比較相鄰兩個陣列元素的大小,若後面的元素較小,則將連個元素進行交換,交換的同時設定flag的值為1。
當內層for迴圈執行結束後,如果flag的值為0,說明剛結束的這輪排序中沒有發生原色交換,所以可以確定排序已經完成,執行break跳出迴圈,否則繼續進入下一輪冒牌排序。
當整個迴圈結束後,輸出排序後的陣列。
交換法排序
交換法排序是將每個陣列元素與其後的所有元素一一比較,發現符合條件的數則進行交換
假設完成排序的第一個數a[i]與其後的數一一進行比較;若存在比第一個數的值更小的數,則交換兩個值
程式定義了兩個迴圈變數 i , j,作為陣列元素的下標;定義了一個整型陣列a,它包整型含10個元素,定義了一個整型temp,用來作為變數交換的中間值;
通過兩個巢狀的for迴圈使用交換法對陣列排序,排序過程是將陣列分成兩部分:完成排序 和 未完成排序
外層for迴圈用來表示排序的輪數,內層for迴圈對當前某輪剩餘未排序元素進行交換排序。
每一輪排序過程,都是將未成年的第一個元素與後面所有的元素逐個進行比較,若第一個元素的值大於後面某個元素時,交換兩個元素的值,接下來繼續比較,知道與最後一個元素比較並交換完為止,一輪排序結束。
每輪排序都將當前未排序元素中的最小值元素交換出來,放在已排序元素的最後,當執行N-1輪之後,所有的元素都完成了排序。
當整個迴圈結束後,輸出排序後的陣列。
——————————————————————————
接下來,通過列印來驗證一下結果對不對
1.產生1-100的隨機數,並存放在陣列中
接下來,就呼叫之前介紹三種排序方法的函式,通過列印結果來看,三種排序方法均完成了從小到大的排序
接下來,我們就對三種排序方法做個小比較
1 。
選擇法排序
共需要進行n(n-1)/2次比較,互相交換n-1 次。選擇法排序簡單、容易實現,適用於數量較小的排序,但它是不穩定的排序演算法,也就是說,對應有相同關鍵字的記錄,排序後可能會顛倒次序。
2. 冒泡法排序
在小例中,使用flag作為判斷終止迴圈的條件。可想而知,氣泡排序的最好情況就是正序,只需要比較一次;最壞的情況就是逆序,需要比較n的平方次,他是穩定的排序演算法,當待排序列相對有序時,效果較好
3.交換法排序
不穩定的排序演算法,當待排序列相對有序時效果較好,最壞情況是待排序列逆序。
相關文章
- 這幾個python常用的庫你必須知道!Python
- LLM部署,你必須要知道的幾個技巧!
- C#.NET 中你必須知道的反射C#反射
- 你必須知道的 SmartSql !SQL
- 【網路安全】你必須知道的幾個網路安全概念
- C陷阱和缺陷,必須知道的495個C語言問題C語言
- ?你必須知道的Java泛型Java泛型
- 學習 Java 語言,你必須知道的 Java 簡史Java
- 學習Kali Linux必須知道的幾點Linux
- 關於Mysql事務,你必須知道的幾個知識點!MySql
- [C#.NET 拾遺補漏]04:你必須知道的反射C#反射
- 你必須知道的HTTP基本概念HTTP
- 你必須要知道的babel二三事Babel
- 5G大規模商用來臨之前,你必須知道的幾個知識點
- using 你知道多少?你必須知道的.NET讀書筆記筆記
- New的幾個問題 詳解 --讀你必須知道的.NET筆記筆記
- C++語言中std::array的神奇用法總結,你需要知道!C++
- 3款你必須知道的爬蟲工具爬蟲
- .Net Core 你必須知道的source-generators
- 函式你必須知道的三種角色?函式
- 敲黑板:InnoDB的Double Write,你必須知道
- 你必須知道的Java基礎知識Java
- is 和 as 讀你必須知道的.net 筆記筆記
- 你必須要知道的HTTP協議原理HTTP協議
- 入行你必須知道的15個大資料專業術語,大資料教程限時領大資料
- JS高階之面試必須知道的幾個點JS面試
- 配音技巧 | 學配音必須要知道的幾個技巧
- Java的十大演算法,你知道幾個?Java演算法
- 關於Http協議,你必須要知道的HTTP協議
- 盤點 Java 開發 2020 年發生的幾件大事,你必須得知道!Java
- 你必須得知道的人工智慧領域的大師與大事人工智慧
- Python有哪幾種編碼方式?這幾類必須知道!Python
- 大學期間必須知道的JVM知識JVM
- 邊緣計算你必須知道的100個術語
- Python 這10個字典操作你必須知道Python
- 入門node.js你必須知道的那些事Node.js
- 這10款好用的Windows軟體,你必須知道!Windows
- 【推薦】Python中你必須要知道的IDE工具!PythonIDE