演算法(二):氣泡排序
氣泡排序(Bubble Sort),是一種電腦科學領域的較簡單的排序演算法。
它重複的走訪過要排列的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來,走訪數列的工作是重複的進行直到沒有有再需要交換,也就是說該數列已經排序完成。
這個演算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列頂端,所以命名為氣泡排序。
演算法原理:
氣泡排序演算法的運作如下:(從後往前)
1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
3.針對所有的元素重複以上的步驟,除去最後一個。
4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
演算法穩定性
氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素,交換也發生在這兩個元素之間。所以,如果兩個元素相等,就不需要交換兩個元素;如果兩個相等的元素沒有相鄰,那麼及時用過前面的兩兩交換把兩個相鄰起來,這個時候也不需要交換,所以相同元素的前後順序並沒有改變,所以氣泡排序是一種穩定的演算法排序。
原始待排序陣列| 6 | 2 | 4 | 1 | 5 | 9 |
第一趟排序(外迴圈)
第一次兩兩比較6 > 2交換(內迴圈)
交換前狀態| 6 | 2 | 4 | 1 | 5 | 9 |
交換後狀態| 2 | 6 | 4 | 1 | 5 | 9 |
第二次兩兩比較,6 > 4交換
交換前狀態| 2 | 6 | 4 | 1 | 5 | 9 |
交換後狀態| 2 | 4 | 6 | 1 | 5 | 9 |
第三次兩兩比較,6 > 1交換
交換前狀態| 2 | 4 | 6 | 1 | 5 | 9 |
交換後狀態| 2 | 4 | 1 | 6 | 5 | 9 |
第四次兩兩比較,6 > 5交換
交換前狀態| 2 | 4 | 1 | 6 | 5 | 9 |
交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |
第五次兩兩比較,6 < 9不交換
交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |
交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |
第二趟排序(外迴圈)
第一次兩兩比較2 < 4不交換
交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |
交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |
第二次兩兩比較,4 > 1交換
交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |
交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |
第三次兩兩比較,4 < 5不交換
交換前狀態| 2 | 1 | 4 | 5 | 6 | 9 |
交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |
第四次兩兩比較,5 < 6不交換
交換前狀態| 2 | 1 | 4 | 5 | 6 | 9 |
交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |
第三趟排序(外迴圈)
第一次兩兩比較2 > 1交換
交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |
交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |
第二次兩兩比較,2 < 4不交換
交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |
交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |
第三次兩兩比較,4 < 5不交換
交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |
交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |
第四趟排序(外迴圈)無交換
第五趟排序(外迴圈)無交換
排序完畢,輸出最終結果1 2 4 5 6 9
#include<stdio.h>
#define SIZE 8
void bubble_sort (int a[], int n);
void bubble_sort (int a[], int n)
{
int i, j, temp;
for (j = 0; j < n - 1; j++){
for (I = 0; i < n - 1 - j; i++ ){
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
}
int main()
{
int number[SIZE] = {95,45,15,78,84,51,24,12};
int i;
bubble_sort(number,SIZE);
for (i = 0; i < SIZE; i++ ){
printf("%d",number[i]);
}
printf("\n")
}