氣泡排序法(Bubble Sort)是排序演算法的一種,其觀念是逐次比較相鄰的兩筆資料,然後根據排序條件交換(由小到大或由大到小),一直交換到資料排序完成為止。
本文以C++實作執行。
氣泡排序演算法的運作原理如下:
1.比較相鄰的元素,如果第一個元素比第二個元素大(小),就交換這兩個元素。
2.對每一對相鄰的元素執行同樣的行為,從開始的第一對到結尾的最後一對。當這部做完之後最後的元素會是最大(小)的數。
3.針對除了最後一個已經排序過後的數之外重複步驟一跟步驟二。
4.持續每次對越來越少的未排序的元素重複上面的步驟,直到沒有任何一對數字需要比較。
執行時,未排序資料中的最大值會如同氣泡般往右邊移動,故此命名為氣泡排序法。
範例: 由小到大排序 3 7 1 2 9 4
第一輪:
3 7 1 2 9 4
3 7 1 2 9 4
3 1 7 2 9 4
3 1 2 7 9 4
3 1 2 7 9 4
3 1 2 7 4 9 (此時9是最大的已排序的數,故第二輪無須交換他)
第二輪:
3 1 2 7 4 9
1 3 2 7 4 9
1 2 3 7 4 9
1 2 3 7 4 9
1 2 3 4 7 9 (此時7是第二大的已排序的數,故第三輪無須交換他)
第三輪:
1 2 3 4 7 9 (此時4是第三大的已排序的數,故第四輪無須交換他)
第四輪:
1 2 3 4 7 9 (此時3是第四大的已排序的數,故第五輪無須交換他)
第五輪:
1 2 3 4 7 9 (此時2是第五大的已排序的數,故第六輪無須交換他)
第六輪:
1 2 3 4 7 9 (此時1是第六大的已排序的數,且也已經沒有未排序的數,由此可知1 2 3 4 7 9是最終由小到大排序)
時間複雜度如下:
最佳時間複雜度:O(n):當資料的順序恰好是所選擇的排序方式時。
平均時間複雜度:O(n^2):第n筆資料,平均比較(n-1)/2 次。
最差時間複雜度:O(n^2):當資料的排序恰好是所選擇的相反排序方式時。
其原理的虛擬碼大致如下:
template < typename T > //整數或浮點數皆可使用
void bubbleSort (T arr[], int len){
int i, j, temp;
for( i = to len-2)
{
for(j = 0 to length-2-i)
{
if(array[j]>array[j+1])
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
完整程式碼如下:
#include <iostream>
using namespace std;
int bubbleSort(int[], int);
int main()
{
int *ptr;//宣告指標ptr
int size;//宣告陣列大小
cout << "請輸入陣列大小:";
cin >> size;//輸入陣列大小
ptr = new int[size];//建立動態記憶體陣列
for (int i = 0; i < size; i++)
{
cin >> *(ptr + i);//輸入陣列中的資料
}
cout << "排序前:" << endl;
for (int j = 0; j < size; j++)
{
cout << *(ptr + j) << " ";//印出陣列中的資料
}
cout << endl;
bubbleSort(ptr, size);
cout << "排序後:" << endl;
for (int k = 0; k < size; k++)
{
cout << *(ptr + k) << " ";//印出排序後的陣列中的資料
}
system("pause");
return 0;
}
int bubbleSort(int a[], int len)
{
int i, j, temp;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len - 1 - i; j++)
if (a[j] > a[j + 1])
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
return *a;
}
執行結果如下:
有夢最美 築夢踏實
活在當下 認真過每一天
我是阿夢 也是Ace