1. 程式人生 > >演算法(二):氣泡排序

演算法(二):氣泡排序

氣泡排序(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")
}