冒泡排序(Bubble Sorting)的基本思想是:設待排序n個元素存放在數組a[n]中,無序區範圍初始為(a(0),a(1),a(2),...,a[n-1]),冒泡排序方法是在當前無序區內,從最上面的元素a[0]開始,對每兩個相鄰的元素a[i+1]和a[i](i=0,1,...,n-1)進行比較,且使值較小的元素換至值較大的元素之上(若a[i]>a[i+1],則a[i]和a[i+1]的值互換),這樣經過一趟冒泡排序後,假設最後下移的元素為a[k],則無序區中值較大的幾個元素到達下端並從小到大依次存放在a[k+1],a[k+2],...a[n-1]中,這樣無序區範圍變為(a[0],a[1],a[2],...,a[k])。在當前無序區內進行下一趟冒泡排序。這個過程一直到某一趟排序中不出現元素交換的動作,排序結束。整個排序過程最多執行n-1遍。這種排序方法是通過相鄰元素之間的比較與交換,使值較小的元素逐漸從後部移向前部(從下標較大的單元移向下標較小的單元),就象水底下的氣泡一樣逐漸向上冒。故稱為冒泡排序法。
1、排序方法
將被排序的記錄數組R[1..n]垂直排列,每個記錄R[i]看作是重量為R[i].key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反覆進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。
(1)初始
R[1..n]為無序區。
(2)第一趟掃描
從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。即依次比較(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);對於每對氣泡(R[j+1],R[j]),若R[j+1].key<R[j].key,則交換R[j+1]和R[j]的內容。
第一趟掃描完畢時,"最輕"的氣泡就飄浮到該區間的頂部,即關鍵字最小的記錄被放在最高位置R[1]上。
(3)第二趟掃描
掃描R[2..n]。掃描完畢時,"次輕"的氣泡飄浮到R[2]的位置上……
最後,經過n-1 趟掃描可得到有序區R[1..n]
注意:
第i趟掃描時,R[1..i-1]和R[i..n]分別為當前的有序區和無序區。掃描仍是從無序區底部向上直至該區頂部。掃描完畢時,該區中最輕氣泡飄浮到頂部位置R[i]上,結果是R[1..i]變為新的有序區。
2、冒泡排序過程樣本
對關鍵字序列為49 38 65 97 76 13 27 49的檔案進行冒泡排序的過程【參見動畫示範】
3、排序演算法
(1)分析
因為每一趟排序都使有序區增加了一個氣泡,在經過n-1趟排序之後,有序區中就有n-1個氣泡,而無序區中氣泡的重量總是大於等於有序區中氣泡的重量,所以整個冒泡排序過程至多需要進行n-1趟排序。
若在某一趟排序中未發現氣泡位置的交換,則說明待排序的無序區中所有氣泡均滿足輕者在上,重者在下的原則,因此,冒泡排序過程可在此趟排序後終止。為此,在下面給出的演算法中,引入一個布爾量exchange,在每趟排序開始前,先將其置為FALSE。若排序過程中發生了交換,則將其置為TRUE。各趟排序結束時檢查exchange,若未曾發生過交換則終止演算法,不再進行下一趟排序。
(2)具體演算法
using System;
using System.Collections.Generic;
using System.Text;
namespace ExEbullitionSorter
{
class EbullitionSorter
{
public void Sort(int[] arr)
{
int i, j, temp;
bool done = false;
j = 1;
while ((j < arr.Length) && (!done))//判斷長度
{
done = true;
for (i = 0; i < arr.Length - j; i++)
{
if (arr[i] > arr[i + 1])
{
done = false;
temp = arr[i];
arr[i] = arr[i + 1];//交換資料
arr[i + 1] = temp;
}
}
j++;
}
}
static void Main(string[] args)
{
int[] array = new int[] { 1, 5, 3, 6, 10, 55, 9, 2, 87, 12, 34, 75, 33, 47 };
EbullitionSorter e = new EbullitionSorter ();
e.Sort(array);
foreach (int m in array)
Console.WriteLine("{0}", m);
}
}
}