冒泡排序
![]() 使用冒泡排序為一列數字進行排序的過程 |
|
| 分類 | 排序算法 |
|---|---|
| 數據結構 | 數組 |
| 最差時間復雜度 | ![]() |
| 最優時間復雜度 | ![]() |
| 平均時間復雜度 | ![]() |
| 最差空間復雜度 | 总共 ,需要辅助空间![]() |
| 最佳算法 | No |
冒泡排序(Bubble Sort,台灣譯為:泡沫排序或氣泡排序)是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。
冒泡排序對
個項目需要O(
)的比較次數,且可以原地排序。儘管這個演算法是最簡單瞭解和實作的排序算法之一,但它對於少數元素之外的數列排序是很沒有效率的。
冒泡排序是與插入排序擁有相等的執行時間,但是兩種法在需要的交換次數卻很大地不同。在最壞的情況,冒泡排序需要
次交換,而插入排序只要最多
交換。冒泡排序的實現(類似下面)通常會對已經排序好的數列拙劣地執行(
),而插入排序在這個例子只需要
個運算。因此很多現代的演算法教科書避免使用冒泡排序,而用插入排序取代之。冒泡排序如果能在內部迴圈第一次執行時,使用一個旗標來表示有無需要交換的可能,也有可能把最好的複雜度降低到
。在這個情況,在已經排序號的數列就無交換的需要。若在每次走訪數列時,把走訪順序和比較大小反過來,也可以些微地改進效率。有時候稱為往返排序,因為演算法會從數列的一端到另一端之間穿梭往返。
冒泡排序演算法的運作如下:
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
- 針對所有的元素重複以上的步驟,除了最後一個。
- 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
由於它的簡潔,冒泡排序通常被用來對於程式設計入門的學生介紹演算法的概念。
目录 |
[编辑] 虛擬碼
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) //两两排序(升序/降序)
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)
[编辑] 外部鏈接
|
||||||||||||||||||||||||||||

