C語言學習 將陣列元素進行氣泡排序

2021-10-21 17:24:10 字數 2432 閱讀 3093

在實際開發中,有很多場景需要我們將陣列元素按照從大到小(或者從小到大)的順序排列,這樣在查閱資料時會更加直觀,例如:

乙個儲存了商品單價的陣列,排序後更容易看出它們的價效比。

對陣列元素進行排序的方法有很多種,比如氣泡排序、歸併排序、選擇排序、插入排序、快速排序等,其中最經典最需要掌握的是「氣泡排序」。

以從小到大排序為例,氣泡排序的整體思想是這樣的:

從陣列頭部開始,不斷比較相鄰的兩個元素的大小,讓較大的元素逐漸往後移動(交換兩個元素的值),直到陣列的末尾。經過第一輪的比較,就可以找到最大的元素,並將它移動到最後乙個位置。

第一輪結束後,繼續第二輪。仍然從陣列頭部開始比較,讓較大的元素逐漸往後移動,直到陣列的倒數第二個元素為止。經過第二輪的比較,就可以找到次大的元素,並將它放到倒數第二個位置。

以此類推,進行 n-1(n 為陣列長度)輪「冒泡」後,就可以將所有的元素都排列好。

整個排序過程就好像氣泡不斷從水裡冒出來,最大的先出來,次大的第二出來,最小的最後出來,所以將這種排序方式稱為氣泡排序(bubble sort)。

下面我們以「3  2  4  1」為例對氣泡排序進行說明。

第一輪  排序過程

3  2  4  1    (最初)

2  3  4  1    (比較3和2,交換)

2  3  4  1    (比較3和4,不交換)

2  3  1  4    (比較4和1,交換)

第一輪結束,最大的數字 4 已經在最後面,因此第二輪排序只需要對前面三個數進行比較。

第二輪  排序過程

2  3  1  4 (第一輪排序結果)

2  3  1  4 (比較2和3,不交換)

2  1  3  4 (比較3和1,交換)

第二輪結束,次大的數字 3 已經排在倒數第二個位置,所以第三輪只需要比較前兩個元素。

第三輪  排序過程

2  1  3  4  (第二輪排序結果)

1  2  3  4  (比較2和1,交換)

至此,排序結束。

演算法總結及實現

對擁有 n 個元素的陣列 r[n] 進行 n-1 輪比較。

第一輪,逐個比較 (r[1], r[2]),  (r[2], r[3]),  (r[3], r[4]),  …….  (r[n-1], r[n]),最大的元素被移動到 r[n] 上。

第二輪,逐個比較 (r[1], r[2]),  (r[2], r[3]),  (r[3], r[4]),  …….  (r[n-2], r[n-1]),次大的元素被移動到 r[n-1] 上。

以此類推,直到整個陣列從小到大排序。

具體的**實現如下所示:

#include

int main();

int i, j, temp;

//氣泡排序演算法:進行 n-1 輪比較

for(i=0; i<10-1; i++);

int i, j, temp, issorted;

//優化演算法:最多進行 n-1 輪比較

for(i=0; i<10-1; i++){

issorted = 1; //假設剩下的元素已經排序好了

for(j=0; j<10-1-i; j++){

if(nums[j] > nums[j+1]){

temp = nums[j];

nums[j] = nums[j+1];

nums[j+1] = temp;

issorted = 0; //一旦需要交換陣列元素,就說明剩下的元素沒有排序好

if(issorted) break; //如果沒有發生交換,說明剩下的元素已經排序好了

for(i=0; i<10; i++){

printf("%d ", nums[i]);

printf("\n");

return 0;

我們額外設定了乙個變數 issorted,用它作為標誌,值為「真」表示剩下的元素已經排序好了,值為「假」表示剩下的元素還未排序好。

每一輪比較之前,我們預先假設剩下的元素已經排序好了,並將 issorted 設定為「真」,一旦在比較過程中需要交換元素,就說明假設是錯的,剩下的元素沒有排序好,於是將 issorted 的值更改為「假」。

每一輪迴圈結束後,通過檢測 issorted 的值就知道剩下的元素是否排序好。

另外如果你想更好的提公升你的程式設計能力,學好c語言c++程式設計!彎道超車,快人一步!筆者這裡或許可以幫到你~

程式設計學習:

程式設計學習:

c語言學習 陣列

我們在程式設計時往往需要儲存很多數,這個時候我們就需要陣列這個工具了 1.陣列的宣告 型別 變數名稱 元素數量 double weight 20 元素數量必須是整數 定義 是一種容器 放東西的東西 特點是 1.其中所有的元素具有相同的資料型別 2.一旦建立,不能改變大小 3.陣列中的元素在記憶體中是...

C語言學習 陣列

代表c語言提高端段筆記哈哈 陣列加強了資料處理能力 即在記憶體中開一段連續的空間 注意從a 0 開始 include int main sum n printf d n sum for n 0 n 第乙個陣列演算法 一般計數器都用0為初值加 號聯動的原因也是因為陣列標號從0開始 陣列是有型別屬性的 ...

C程式語言學習 氣泡排序

用某人的話說就是我們只要掌握氣泡排序就好了。原因有一下幾點 1 在使用陣列進行排序的情況下,其他的排序方法是可能快些,但是在資料量大的情況 2 但是資料量大肯定肯定不會使用陣列,肯定是使用鍊錶樹,這樣就不用排序演算法了。3 一般現實場景都是動態分配記憶體,所以也用不到陣列排序。4 如果要使用也是資料...