Bubble Sort - 氣泡排序

核心:氣泡,持續比較相鄰元素,大的挪到後面,因此大的會逐步往後挪,故稱之為氣泡。

Bubble Sort

Implementation

Python

  1. #!/usr/bin/env python
  2. def bubbleSort(alist):
  3. for i in xrange(len(alist)):
  4. print(alist)
  5. for j in xrange(1, len(alist) - i):
  6. if alist[j - 1] > alist[j]:
  7. alist[j - 1], alist[j] = alist[j], alist[j - 1]
  8. return alist
  9. unsorted_list = [6, 5, 3, 1, 8, 7, 2, 4]
  10. print(bubbleSort(unsorted_list))

Java

  1. public class Sort {
  2. public static void main(String[] args) {
  3. int unsortedArray[] = new int[]{6, 5, 3, 1, 8, 7, 2, 4};
  4. bubbleSort(unsortedArray);
  5. System.out.println("After sort: ");
  6. for (int item : unsortedArray) {
  7. System.out.print(item + " ");
  8. }
  9. }
  10. public static void bubbleSort(int[] array) {
  11. int len = array.length;
  12. for (int i = 0; i < len; i++) {
  13. for (int item : array) {
  14. System.out.print(item + " ");
  15. }
  16. System.out.println();
  17. for (int j = 1; j < len - i; j++) {
  18. if (array[j - 1] > array[j]) {
  19. int temp = array[j - 1];
  20. array[j - 1] = array[j];
  21. array[j] = temp;
  22. }
  23. }
  24. }
  25. }
  26. }

C++

  1. void bubbleSort(vector<int> & arr){
  2. for(int i = 0; i < arr.size(); i++){
  3. for(int j = 1; j < arr.size() - i; j++){
  4. if(arr[j - 1] > arr[j])){
  5. std::swap(arr[j-1], arr[j]);
  6. }
  7. }
  8. }
  9. return arr;
  10. }

複雜度分析

平均情況與最壞情況均為 O(n^2), 使用了 temp 作為臨時交換變量,空間複雜度為 O(1).
可以做適當程度的優化,當某一次外迴圈中發現陣列已經有序,就跳出迴圈不再執行,但這僅對於部分的輸入有效,平均及最壞時間複雜度仍為O(n^2)

  1. void bubbleSort(vector<int> & arr){
  2. bool unsorted = true;
  3. for(int i = 0; i < arr.size() && unsorted; i++){
  4. unsorted = false;
  5. for(int j = 1; j < arr.size() - i; j++){
  6. if(arr[j - 1] > arr[j])){
  7. std::swap(arr[j-1], arr[j]);
  8. unsorted = true;
  9. }
  10. }
  11. }
  12. return arr;
  13. }

Reference