冒泡排序的 C 程序:C 中的冒泡排序

已發表: 2020-10-20

目錄

介紹

數組的排序在計算機科學中佔有極其重要的地位。 當需要按特定順序排列數據時,會注意到它的實用性。 有不同種類的排序算法。 最常見和廣泛使用的排序算法是冒泡排序。

C中的冒泡排序

冒泡排序中用於排序的技術簡單易懂。 它所做的只是將當前元素與下一個元素進行比較,如果它大於或小於條件所指示的,則交換它。 該算法非常準確。 每次將一個元素與其他元素進行比較,直到找到它的位置,這稱為一次通過。

該算法可與水中的氣泡相媲美,因為它會過濾掉陣列狀氣泡的頂部。 在所有用於排序的算法中,冒泡排序是最簡單和最慢的,時間複雜度為 O(n^2)。 但是,可以通過使用在交換完成時退出循環的標誌變量來優化算法。 對數組進行排序時,冒泡排序的最佳情況可能是 O(n)。

例如,讓我們取一個由五個數字組成的未排序數組,如下所示

13, 32,26, 34,9

冒泡排序將開始考慮前兩個元素,並將比較它們以檢查哪個更大。 在這種情況下,32 大於 13。所以這部分已經是 y 排序的。 接下來,我們將 32 與 26 進行比較。所以我們發現 32 大於 26,因此必須交換它們。 新數組看起來像

13、26、32、34、9

接下來,我們比較 32 和 34。我們知道它們已經排序。 因此,我們移動到最後兩個變量 34 和 9。由於 34 大於 9,因此必須交換它們。

我們交換值並在第一次迭代後到達數組的末尾。 現在數組看起來像

13, 26. 32,9,34

第二次迭代後,數組看起來像

13、26、9、32、34

第三次迭代後,數組將變為

13,9,26,32,34

第四次迭代後,數組將完全排序

9、13、26、32、34

必讀: C 中的項目理念

算法

這裡我們假設數組有 n 個元素。 此外,我們假設交換值函數正在交換所有值以使數組編號按排序順序排列。

開始冒泡排序(數組)

對於列表的所有元素

如果數組[i]> 數組[i+1]

交換值(數組[i],數組[i+1])

萬一

結束

返回數組

結束冒泡排序

閱讀:數據結構中的排序:類別和類型

偽代碼

上面的算法很明顯,每對數組元素之間都有一個比較,直到整個數組升序排序。 它可能會導致一些複雜性問題,例如當數組已經按升序排序時算法的結果。 為了緩解這個問題,我們將使用一個標誌變量,它使我們能夠查看是否有任何交換。 如果不再需要交換,我們將退出內部循環。

BubbleSort算法的偽代碼可以寫成如下

過程 BubbleSort(數組:數組中的項目)

迭代=數組.計數;

對於 k=0 迭代 1 做:

標誌=假

對於 l=0 迭代-1 做:

如果 (數組[l]> 數組[l+1]) 那麼

交換值(數組 [l],數組 [l+1])

標誌=真

萬一

結束

如果(未交換)則

休息

萬一

結束

結束過程返回數組

讓我們在 C 中嘗試一個冒泡排序的示例程序

# 包括<stdio.h>

無效的主要

{

int 數組 [10], i, j, num

對於 (i=0; i<=9; i++)

{

scanf(“%d”, &array[i])

}

for(i=0;i<=9;i++)

{

for(j=0;j<=9-i;j++)

{

如果(數組[j]>數組[j+1])

{

數=數組[j];

數組[j]=數組[j+1];

數組[j+1]=num;

}

}

}

printf("排序後的數組是/n");

for(i=0;i<=9;i++)

{

printf(“%d”,&array[i])

}

}

如示例所示,此冒泡排序算法接受來自用戶的 10 個數字並將其存儲在數組中。 在下一部分中,有兩個 for 循環。 外部循環運行 I 值,等於 0 到小於等於 9。 外循環的功能是處理必須與其他元素進行比較的值的所有元素。

外循環內部還有另一個循環。 它從 j=0 開始,一直運行到小於或等於 8。 在內部,有一個條件 if 語句比較並檢查數組 [j] 是否大於數組 [j+1]。 如果滿足條件,則數組[j] 和數組[j+1] 的值相互交換。

名稱為 num 的變量用於此目的。 首先將array[j] 分配給num,然後將array[j+1] 分配給array[j],最後將num 分配給array[j+1]。 這個過程將一直持續到數組中的所有元素都按升序排序。 之後,打印排序後的數組。

冒泡排序的優化實現

我們有一個優化的冒泡排序算法來改進結果。 使用標誌變量進行優化。 如果有交換,標誌變量將保持 1,否則它將從循環中中斷。 下面是C 語言中優化的冒泡排序程序。

#include<stdio.h>

無效的主要

{

int 數組 [10], i, j, num, flag=0;

對於 (i=0; i<=9; i++)

{

scanf(“%d”, &array[i])

}

for(i=0;i<=9;i++)

{

for(j=0;j<=9-i;j++)

{

如果(數組[j]>數組[j+1])

{

數=數組[j];

數組[j]=數組[j+1];

數組[j+1]=num;

標誌=1;

}

如果(!標誌)

{

休息;

}

}

}

printf("排序後的數組是/n");

for(i=0;i<=9;i++)

{

printf(“%d”,&array[i])

}

}

給定程序的執行方式類似於正常的冒泡排序程序。 唯一的變化是使用了標誌變量。 最初,該標誌設置為 0。但是,如果發生交換,則該標誌變為 1。這意味著該數組仍需要再次檢查。 另一方面,如果標誌不為 1,則表示沒有發生交換,我們退出內部循環,假設數組已經排序。 一旦執行,我們將得到與普通冒泡排序相同的結果。

時間複雜度

冒泡排序的最佳時間複雜度為 O(n)。 當數組已經排序時會發生這種情況。 當數組尚未排序時,最壞的情況是 O(n*n)。

閱讀: Java 中的 12 大模式程序,你今天應該檢查一下

接下來是什麼?

如果您有興趣了解有關 Java、全棧軟件開發的更多信息,請查看 upGrad 和 IIIT-B 的全棧軟件開發 PG 文憑,該文憑專為在職專業人士設計,提供 500 多個小時的嚴格培訓,9 個以上的項目和任務、IIIT-B 校友身份、實用的實踐頂點項目和頂級公司的工作協助。

踏上夢想的工作

升級和 IIIT-BANGALORE 的軟件開發 PG 文憑
今天報名