氣泡排序法(C語言)
阿新 • • 發佈:2020-12-13
氣泡排序:相鄰兩個數兩兩比較,小的數向前移(上浮),大的數向後移(下沉),如同水中的泡泡上浮一般;
氣泡排序圖示:
如果有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;
}