1. 程式人生 > 其它 >氣泡排序法(C語言)

氣泡排序法(C語言)

技術標籤:C語言c語言演算法排序演算法

氣泡排序:相鄰兩個數兩兩比較,小的數向前移(上浮),大的數向後移(下沉),如同水中的泡泡上浮一般;

氣泡排序圖示:
在這裡插入圖片描述
在這裡插入圖片描述
如果有N個數,則要跑N-1次比較(每跑一次比較就會有一個較大數“沉底”),交換兩個數的次數會隨著跑的次數越來越多而變少。

C語言程式碼:

#include<stdio.h>
int main()
{
    int a[5]={4,3,1,6,0};
    int t,i,j;
    for(i=0;i<5-1;i++)//要跑5-1次
    {
        for(j=0;j<5-i-1;j++)//5-i-1中的減1是為了防止陣列越界
{ if(a[j]<a[j+1])//改變大於小於號可以實現升序排序(>)或降序排序 (<) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } for(i=0;i<5;i++) { printf("%d\t",a[i]); } return 0; }

但是上述程式碼有一個缺點,如果要比較5個數(1,-1,8,4,2)會發現當跑第二次的時候數列已經有序了,剩下的第三次和第四次是可以不用跑的,是多餘的。對程式碼進行優化,這樣可以節省執行時間。

例子:

原始陣列:1,-1,8,4,2

(1)-1,1,4,2,8

(2)-1,1,2,4,8

(3)-1,1,2,4,8
(4)-1,1,2,4,8

從上面看出從跑第3次時就已經沒有兩個數交換了(說明此時陣列已經有序了),因此我們可以設定一個bool變數用來檢測是否發生兩個數的交換,如果沒有則說明陣列已經有序了,可以跳出迴圈了。

優化後的程式碼如下:

#include<stdio.h>
#include<stdbool.h>
int main()

{
    int a[5]={4,3,1,6,0};
    int t,i,j;
    for(i=0;i<5
-1;i++)//要跑5-1次 { bool swapped=false;//假設沒有元素交換 for(j=0;j<5-i-1;j++)//5-i-1中的減1是為了防止陣列越界 { if(a[j]<a[j+1])//改變大於小於號可以實現升序排序(>)或降序排序 (<) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; swapped=true; } } if(!swapped)//沒有元素交換,陣列已有序 { break; } } for(i=0;i<5;i++) { printf("%d\t",a[i]); } return 0; }