氣泡排序是很easy理解和實現,,以從小到大排序舉例:
設陣列長度為N。
1.比較相鄰的前後二個資料,假設前面資料大於後面的資料,就將二個資料交換。
2.這樣對陣列的第0個資料到N-1個資料進行一次遍歷後,最大的一個資料就“沉”到陣列第N-1個位置。
3.N=N-1,假設N不為0就反覆前面二步,否則排序完畢。
依照定義非常easy寫出程式碼:
//氣泡排序1
void BubbleSort1(int a[], int n)
{
int i, j;
for (i = 0; i < n; i++)
for (j = 1; j < n - i; j++)
if (a[j - 1] > a[j])
Swap(a[j - 1], a[j]);
}
以下對其進行優化,設定一個標誌,假設這一趟發生了交換,則為true,否則為false。明顯假設有一趟沒有發生交換,說明排序已經完畢。
//氣泡排序2 void BubbleSort2(int a[], int n) { int j, k; bool flag; k = n; flag = true; while (flag) { flag = false; for (j = 1; j < k; j++) if (a[j - 1] > a[j]) { Swap(a[j - 1], a[j]); flag = true; } k--; } }
再做進一步的優化。假設有100個數的陣列,僅前面10個無序,後面90個都已排好序且都大於前面10個數字,那麼在第一趟遍歷後,最後發生交換的位置必然小於10,且這個位置之後的資料必然已經有序了,記錄下這位置,第二次僅僅要從陣列頭部遍歷到這個位置就能夠了。
//氣泡排序3
void BubbleSort3(int a[], int n)
{
int j, k;
int flag;
flag = n;
while (flag > 0)
{
k = flag;
flag = 0;
for (j = 1; j < k; j++)
if (a[j - 1] > a[j])
{
Swap(a[j - 1], a[j]);
flag = j;
}
}
}
氣泡排序畢竟是一種效率低下的排序方法,在資料規模非常小時,能夠採用。資料規模比較大時,最好用其他排序方法。