氣泡排序

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

氣泡排序對個專案需要 O 的比較次數，且可以原地排序。儘管這個演演算法是最簡單瞭解和實作的排序演算法之一，但它對於包含大量的元素的數列排序是很沒有效率的。

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

氣泡排序演演算法的運作如下：

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

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

虛擬碼

function bubble_sort (array, length) {

var i, j;

for (i from 0 to length-1){for (j from 0 to length-2-i){if (arrayj> arrayj+1)

swap (arrayj, arrayj+1)

}

}

}

函式 泡沫排序 輸入 一個陣列名稱為 array 其長度為 length

i 從 0 到 (length - 1)

j 從 0 到 (length - 2 - i)

如果 arrayj > arrayj + 1

交換 arrayj 和 arrayj + 1 的值

如果結束

j 迴圈結束

i 迴圈結束

函式結束

助記碼

i∈0,N-1) // 迴圈 N-1 遍

j∈0,N-1-i) // 每遍迴圈要處理的無序部分

swap (j,j+1) // 兩兩排序（升序 / 降序）

實作範例

3.1 C 語言

include
define ARR_LEN 255 / 陣列長度上限 /
define elemType int / 元素型別 /

/ 泡沫排序 /

/ 1. 從當前元素起，向後依次比較每一對相鄰元素，若逆序則互換 /

/ 2. 對所有元素均重複以上步驟，直至最後一個元素 /

/ elemType arr: 排序目標陣列；int len: 元素個數 /

void bubbleSort (int arr, int len)

{

	int i, j,temp;

	_Bool exchanged = true;

	for (i=0; exchanged && i arrj+1)

			{ / 相鄰元素比較，若逆序則互換（升序為左大於右，逆序反之） /

				temp = arrj;

				arrj = arrj+1;

				arrj+1 = temp;

				exchanged = true; / 只有數值互換過，exchanged 才會從 false 變成 true, 否則數列已經排序完成，exchanged 值仍然為 false, 沒必要排序 /

			}

}

}

}

int main (void) {int arrARR_LEN = {3,5,1,-7,4,9,-6,8,10,4};

	int len = 10;

	int i;

	bubbleSort (arr, len);

	for (i=0; i

3.2 C++

include

using namespace std;

template // 整數或浮點數皆可使用，若要使用類 (class) 或結構體 (struct) 時必須過載大於 (>) 運算子

void bubble_sort (T arr, int len) {

	int i, j;

	for (i = 0; i arrj + 1)

				swap (arrj, arrj + 1);

}

int main {int arr = { 61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62};

	int len = (int) sizeof (arr) /sizeof (*arr);

	bubble_sort (arr, len);

	for (int i = 0; i

3.3 C#

private int BubbleSort (int array)

{

var temp = 0;

for (int i = 0; i arrayj + 1)

{

temp = arrayj;

arrayj = arrayj + 1;

arrayj + 1 = temp;

}

}

}

return array;

}

3.4 JAVA

private int bubbleSort (int array) {

int temp;

for (int i = 0; i arrayj + 1) {

temp = arrayj;

arrayj = arrayj + 1;

arrayj + 1 = temp;

Flag = true;

}

}

if (!Flag)

{break;}

}

return array;

}

3.5 Ruby

class Array

def bubble_sort!

for i in 0...(size - 1)

for j in 0...(size - i - 1)

selfj, selfj + 1 = selfj + 1, selfj if selfj > selfj + 1

end

end

self

end

end

puts 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70.bubble_sort!

3.6 JavaScript

Array.prototype.bubble_sort = function {

	var i, j, temp;

	for (i = 0; i thisj + 1) {

				temp = thisj;

				thisj = thisj + 1;

				thisj + 1 = temp;

			}

	return this;

};

var num = 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70;

num.bubble_sort ;

for (var i = 0; i

3.7 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

aj:=aj xor aj+1;

aj+1:=aj xor aj+1;

aj:=aj xor aj+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 aj>aj+1 then

begin

swap (j);

flag:=false;

end;

end;

if flag then exit;

end;

end;

3.8 Python

def bubble_sorted (iterable):

new_list = list (iterable)

listlen = len (newlist)

for i in range (list_len-1):

for j in range (list_len - i - 1):

if newlistj > newlistj + 1:

newlistj, newlistj + 1 = newlistj + 1, newlistj

return new_list

範例：

testlist = 27, 33, 28, 4, 2, 26, 13, 35, 8, 14

print ('sorted:', bubble_sorted (testlist))

輸出：

sorted: 2, 4, 8, 13, 14, 26, 27, 28, 33, 35

3.9 Scratch

3.10 VB.NET

' 泡沫排序由大到小的程式，預先產生一儲存亂數內容的陣列 B，使用中斷點 check，

'switch 為自定兩數交換的 sub

Dim i, j, count As Integer

For i = 0 To UBound (b) - 1

Dim check As Boolean = False ' 進入排序後設定一布林變數令其初值為 false

For j = 0 To UBound (b) - 1 - i

If b (j) b (j + 1) Then switch (b (j), b (j + 1))

count += 1

check = True

Next

If chk = False Then Exit For

Next

MsgBox ("共經過了" & count & "次的排序")

' 兩數值交換程式

Private Sub switch (ByRef a as integer, ByRef b as integer)

Dim c As Integer

c = a

a = b

b = c

End Sub

3.11 PHP

function swap (&$x, &$y) {

	$t = $x;

	$x = $y;

	$y = $t;

}

function bubble_sort (&$arr) {//php 的陣列視為基本型別，所以必須用傳參考才能修改原陣列

	for ($i = 0; $i $arr$j + 1)

				swap ($arr$j, $arr$j + 1);

}

$arr = array (21, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70);

bubble_sort ($arr);

for ($i = 0; $i

3.12 Rust

pub fn bubble_sort (a: &muti32){for i in 0..a.len {for j in i..a.len {if ai> aj {a.swap (i, j);

}

}

}

}

呼叫：

let mut a = 5,4,7,1,9;

bubble_sort (&mut a);

println!("{:?}", a);

3.13 Go

// BubbleSort 氣泡排序. data 必須實現 sort 包中的 Interface 介面

func BubbleSort (data sort.Interface) {n := data.Len

	for i := 0; i

呼叫:

//declare a array

	//this array must implenet sort.Inerface

	data := sort.IntSlice {22, 34, 3, 40, 18, 4}

	BubbleSort (data)

3.14 Objective-C

(NSArray) bubbleSort: (NSArray ) unsortedArray {if (unsortedArray.count sortedArrayj+1 integerValue) {

sortedArray exchangeObjectAtIndex:j withObjectAtIndex:j+1;

exchanged = YES;

}

}

if (!exchanged) {break;}

}

return sortedArray copy;

}

3.15 Swift

func bubbleSort (unsortedArray: inout Int){guard unsortedArray.count> 1 else {return}

for i in 0 .. unsortedArrayj+1 {unsortedArray.swapAt (j, j+1)

exchanged = true

}

}

if !exchanged {break}

}

}

// Test

var list = 2, 3, 5, 7, 4, 8, 6 ,10 ,1, 9

print (list)

bubbleSort (unsortedArray: &list)

print (list)

3.16 Shell

/bin/bash

read -p "Please enter a sequence:" -a num

for ((i=0;i

3.17 IDL

FUNCTION BubbleSort, arr

FOR i = 0, N_ELEMENTS (arr) - 2 DO BEGIN

FOR j = i + 1, N_ELEMENTS (arr) - 1 DO BEGIN

IF arri GT arrj THEN BEGIN

temp = arri & arri = arrj & arrj = temp

ENDIF

ENDFOR

ENDFOR

RETURN, arr

END

3.18 Julia (程式語言)

function BubbleSort (A)

n = length (A)

for i = 1:n

for j = 1:(n-i)

if (Aj>Aj+1)

Aj+1,Aj = Aj,Aj+1

end

end

end

return A

end

Main Code

A = 16,586,1,31,354,43,3

print (A) # Original Array

print (BubbleSort (A)) # Bubble Sort Array