C語言中你必須知道的幾大排序演算法

諸葛青雲h發表於2018-09-14

在實際使用陣列的過程中,陣列不僅可以儲存多個同型別的資料,而且要求這些資料按照某種特徵進行排序。例如,學生的成績,需要按照從高到低的順序排列,這就需要使用排序演算法。

今天介紹幾種簡單的排序演算法:選擇排序,氣泡排序,交換法排序,。快速演算法到時另外單獨分享,涉及到遞迴函式這塊,有點小複雜

首先,第一步,先碼好標頭檔案

#include.h>

#include.h>

先來定義一個輸出函式,傳入陣列的首地址

1240

第一種 選擇法排序(同樣封裝成函式,傳入陣列首地址)

每次共帶排序陣列中選擇一個最小值的陣列元素(若從大到小的順序,每次選擇最大值的陣列元素)

將這個陣列元素的值與最前面還未排序的陣列元素的值進行交換,直到整個陣列都是已排序的陣列元素為止

程式定義了兩個迴圈變數 i , j,作為陣列元素的下標;定義了一個整型陣列a,它包整型含10個元素,定義了一個整型temp,用來作為變數交換的中間值;定義一個整型k,用來記錄每輪選擇排序時當前最小值的下標

1240

外層for迴圈用來表示排序的輪數,內層for迴圈對當前某輪剩餘未排序元素進行選擇排序。每輪排序開始時,都將當前未排好序的小標i 賦給k。接下來遍歷剩下的所有未排序的第一個元素,若當前元素的值小於下標為 k 的元素值,則將k的值賦值給當前元素的下標值,即k始終是遍歷到的所有元素當中最小值的下標。

在本輪迴圈結束後,將k與每輪初值i比較,如果k不等於i ,則表示剩餘所有元素的最小值元素下標不是 i  。這時需要將下標為 i 的元素值與最小值進行交換。

當外層for迴圈的每輪選擇迴圈體執行完畢後,i 下標的元素就是所有剩餘元素中的最小值。當for外層迴圈執行完畢後,排序完成,輸出排序後的陣列元素。

注意:經過了N-1輪選擇,就可以完成N個元素的陣列排序,即前N-1個元素已經排序,最後一個元素肯定就是最大值,不用再排序了。

1240

小編給大家推薦一個學習氛圍超好的地方,C/C++交流企鵝裙:870963251!適合在校大學生,小白,想轉行,想通過這個找工作的加入。裙裡有大量學習資料,有大神解答交流問題,每晚都有免費的直播課程

第二種:冒泡法排序

每次比較陣列中相鄰兩個陣列元素的值,將較小的數排在較大的數前面(按從小到大的順序),每一輪排序後,都有一個最小

的數放在所有未排序的數前面。從後往前逐個比較相鄰兩個數字

1240

程式定義了兩個迴圈變數 i , j,作為陣列元素的下標;定義了一個整型陣列a,它包整型含10個元素,定義了一個整型temp,用來作為變數交換的中間值;定義了一個整型變數flag,用來記錄每輪迴圈是否發生交換,以此判斷排序是否完成。

外層for迴圈用來表示排序的輪數,內層for迴圈對當前某輪剩餘未排序元素進行氣泡排序。

每輪開始時,首先設定flag的初值為0,然後從後往前以此比較相鄰兩個陣列元素的大小,若後面的元素較小,則將連個元素進行交換,交換的同時設定flag的值為1。

當內層for迴圈執行結束後,如果flag的值為0,說明剛結束的這輪排序中沒有發生原色交換,所以可以確定排序已經完成,執行break跳出迴圈,否則繼續進入下一輪冒牌排序。

當整個迴圈結束後,輸出排序後的陣列。

1240

交換法排序

交換法排序是將每個陣列元素與其後的所有元素一一比較,發現符合條件的數則進行交換

假設完成排序的第一個數a[i]與其後的數一一進行比較;若存在比第一個數的值更小的數,則交換兩個值

程式定義了兩個迴圈變數 i , j,作為陣列元素的下標;定義了一個整型陣列a,它包整型含10個元素,定義了一個整型temp,用來作為變數交換的中間值;

1240

通過兩個巢狀的for迴圈使用交換法對陣列排序,排序過程是將陣列分成兩部分:完成排序 和 未完成排序

外層for迴圈用來表示排序的輪數,內層for迴圈對當前某輪剩餘未排序元素進行交換排序。

每一輪排序過程,都是將未成年的第一個元素與後面所有的元素逐個進行比較,若第一個元素的值大於後面某個元素時,交換兩個元素的值,接下來繼續比較,知道與最後一個元素比較並交換完為止,一輪排序結束。

每輪排序都將當前未排序元素中的最小值元素交換出來,放在已排序元素的最後,當執行N-1輪之後,所有的元素都完成了排序。

當整個迴圈結束後,輸出排序後的陣列。

——————————————————————————

接下來,通過列印來驗證一下結果對不對

1.產生1-100的隨機數,並存放在陣列中

接下來,就呼叫之前介紹三種排序方法的函式,通過列印結果來看,三種排序方法均完成了從小到大的排序

1240

接下來,我們就對三種排序方法做個小比較

1240

1 。

選擇法排序

共需要進行n(n-1)/2次比較,互相交換n-1 次。選擇法排序簡單、容易實現,適用於數量較小的排序,但它是不穩定的排序演算法,也就是說,對應有相同關鍵字的記錄,排序後可能會顛倒次序。

2. 冒泡法排序

在小例中,使用flag作為判斷終止迴圈的條件。可想而知,氣泡排序的最好情況就是正序,只需要比較一次;最壞的情況就是逆序,需要比較n的平方次,他是穩定的排序演算法,當待排序列相對有序時,效果較好

3.交換法排序

不穩定的排序演算法,當待排序列相對有序時效果較好,最壞情況是待排序列逆序。


相關文章