冒泡排序

维基百科,自由的百科全书
跳转到: 导航, 搜索
冒泡排序
使用冒泡排序為一列數字進行排序的過程
使用冒泡排序為一列數字進行排序的過程
分類 排序算法
數據結構 數組
最差時間復雜度 O(n^2)
最優時間復雜度 O(n)
平均時間復雜度 O(n^2)
最差空間復雜度 总共O(n),需要辅助空间O(1)
最佳算法 No

冒泡排序Bubble Sort,台灣譯為:泡沫排序氣泡排序)是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

冒泡排序對n個項目需要O(n^2)的比較次數,且可以原地排序。儘管這個演算法是最簡單瞭解和實作的排序算法之一,但它對於少數元素之外的數列排序是很沒有效率的。

冒泡排序是與插入排序擁有相等的執行時間,但是兩種法在需要的交換次數卻很大地不同。在最壞的情況,冒泡排序需要O(n^2)次交換,而插入排序只要最多O(n)交換。冒泡排序的實現(類似下面)通常會對已經排序好的數列拙劣地執行(O(n^2)),而插入排序在這個例子只需要O(n)個運算。因此很多現代的演算法教科書避免使用冒泡排序,而用插入排序取代之。冒泡排序如果能在內部迴圈第一次執行時,使用一個旗標來表示有無需要交換的可能,也有可能把最好的複雜度降低到O(n)。在這個情況,在已經排序號的數列就無交換的需要。若在每次走訪數列時,把走訪順序和比較大小反過來,也可以些微地改進效率。有時候稱為往返排序,因為演算法會從數列的一端到另一端之間穿梭往返。

冒泡排序演算法的運作如下:

  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  3. 針對所有的元素重複以上的步驟,除了最後一個。
  4. 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

由於它的簡潔,冒泡排序通常被用來對於程式設計入門的學生介紹演算法的概念。

目录

[编辑] 虛擬碼

function bubblesort (A : list[1..n]) {
    var int i, j;
    for i from n downto 1 {
        for j from 0 to i-1 { 
            if (A[j] > A[j+1])
                swap(A[j], A[j+1])
        }
    }
}

[编辑] 助记码

 i∈[0,N-1)                //循环N-1遍
   j∈[0,N-1-i)            //每遍循环要处理的无序部分
     swap(j,j+1)          //两两排序(升序/降序)

[1]

 i∈[N-1,0)                //循环N-1遍
   j∈[N-1,N-i-1)            //每遍循环要处理的无序部分
     swap(j,j-1)          //两两排序(升序/降序)

[编辑] Pascal碼

[编辑] 使用標誌的冒泡排序

輸入:(在程式同目錄下的文本文件:input.txt)

 一行:等待排序的數(用空格隔開);

 實例:194 638 124 482 469 245 852 294 484 243 623

輸出:(在程式同目錄下的文本文件:output.txt)

 一行:已經排好的數(從小到大);

 實例:124 194 243 245 294 469 482 484 623 638 852

procedure swap(j:longint);  //交換過程
begin
  a[j]:=a[j] xor a[j+1];
  a[j+1]:=a[j] xor a[j+1];
  a[j]:=a[j] xor a[j+1];
end;
 
procedure bubble_sort;  //排序過程
var
  i,j:longint;
  flag:boolean;  //flag標誌:若一次排序未發現數據交換,則說明數據已經有序,可以結束排序過程
begin
  for i:=n-1 downto 1 do begin
    flag:=true;
    for j:=1 to i do begin
      if a[j]>a[j+1] then begin
        swap(j);
        flag:=false;
      end;
    end;
    if flag then exit;
  end;
end;

[编辑] C語言代碼

[编辑] 标准C语言代码

  1 #include <stdio.h>
  2 
  3 void bubbleSort(int arr[], int count)
  4 {
  5     int i = count, j;
  6     int temp;
  7 
  8     while(i > 0)
  9     {
 10         for(j = 0; j < i - 1; j++)
 11         {
 12             if(arr[j] > arr[j + 1])
 13             {   temp = arr[j];
 14                 arr[j] = arr[j + 1];
 15                 arr[j + 1] = temp;
 16             }
 17         }
 18         i--;
 19     }
 20 
 21 }
 22 
 23 int main(int arc, char* const argv[])
 24 {
 25     //测试数据
 26     int arr[] = {5, 4, 1, 3, 6};
 27     //冒泡排序
 28     bubbleSort(arr, 5);
 29     //打印排序结果
 30     int i;
 31     for(i = 0; i < 5; i++)
 32         printf("%4d", arr[i]);
 33 }

[编辑] 使用標誌的冒泡排序

#include <iostream>
 
using namespace std;
 
void bubble_sort(int d[], int size)
{
        //#假定两两交换发生在数组最后的两个位置#%
        int exchange = size - 1;
 
        while(exchange)
        {
                //#记录下发生数据交换的位置#%
                int bound = exchange;
 
                exchange = 0; //#假定本趟比较没有数据交换#%
 
                for(int i = 0; i < bound; i++)
                {
                        if (d[i] > d[i + 1])
                        {
                                //#交换#%
                                int t = d[i];
                                d[i] = d[i + 1];
                                d[i + 1] = t;
 
                                exchange = i + 1;
                        }
                }
        }
 
}
 
int main (int argc, char * const argv[])
{
        int a[] = {3, 5, 3, 6, 4, 7, 5, 7, 4}; //#QQ#%
 
        bubble_sort(a, sizeof(a) / sizeof(*a));
 
        //#输出#%
        for(int i = 0; i < sizeof(a) / sizeof(*a); i++)
                cout << a[i] << ' ';
        cout << endl;
 
    return 0;
}

[编辑] Python語言代碼

def bubble(L):
    print('start bubble sort:')
    print(L)
    count = 0
    while True:
        step = 0
        for i in range(len(L)-1):
            if L[i] > L[i+1]:
                L[i] ,L[i+1] = L[i+1], L[i]
                print(L)
                step += 1
                count += 1
        if(step == 0):
            return L, 'totalstep:', count

示例:

testlist = [27, 33, 28, 4, 2, 26, 13, 35, 8, 14]
print('final:', bubble(testlist))

輸出: final: ([2, 4, 8, 13, 14, 26, 27, 28, 33, 35], 'totalstep:', 26)

[编辑] 外部鏈接

个人工具
名字空间
操作
导航
帮助
工具
其他语言