排序演算法1——圖解氣泡排序及其實現(三種方法,基於模板及函式指標)
排序演算法1——圖解氣泡排序及其實現(三種方法,基於模板及函式指標)
排序演算法2——圖解簡單選擇排序及其實現
排序演算法3——圖解直接插入排序以及折半(二分)插入排序及其實現
排序演算法4——圖解希爾排序及其實現
排序演算法5——圖解堆排序及其實現
排序演算法6——圖解歸併排序及其遞迴與非遞迴實現
排序演算法7——圖解快速排序以及不同CUTOFF的時間測試
氣泡排序是一種交換排序,基本思想是:
兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止
適用於資料量較小的排序
一、初級版
首先是程式碼和上下界的確定
初級版的思路是:
讓每一個關鍵字,都和它後面的每一個關鍵字作比較,反序就交換。這樣,第一位置的關鍵字在一次迴圈後一定變成最小值
可以看到,初級版的演算法存在兩個問題:
首先,它並不是真正意義上的氣泡排序演算法,因為它不是兩兩相鄰做比較的,只是最簡單的交換順序
其次,在排序過程中,做了很多多餘的比較
二、升級版
三、加強版
這種加強版是基於第二個版本修改的,我們需要設定一個標誌位
在發生交換的時候讓標誌位置位,如果標誌位沒有置位,就說明已經沒有資料交換了,退出迴圈
舉個例子,假如待排序的序列是{2,1,3,4,5,6,7,8,9}
可以看到,在第一趟結束後已經成為了一個有序的序列
也就是說在第二趟i = 1
的時候,完全沒有資料的交換
然後第三趟、第四趟一直到後面的第八趟,都沒有發生資料交換。那麼此時就可以設定一個標誌位
如果在某一趟沒有發生標誌位的置位,就中斷迴圈即可
分析一下該方法的時間複雜度:
最好的情況是本身就是有序的,比較的次數就是n-1
次,沒有資料的交換,時間複雜度為O(N)
最壞的情況是本身是逆序的,比較的次數就是∑(i-1)= n(n-1)/2,i從0到n-1
,時間複雜度為O(N^2)
最後,它一定是適合資料量比較小的情況!
四、測試結果及程式碼
這裡用到了3種版本的bubblesort,所以使用函式指標來實現
#include <iostream>
template<class T>
void BubbleSort0(T *a, int length) {
for (int i = 0; i < length - 1; ++i) {
for (int j = i + 1; j < length; ++j) {
if (a[i] > a[j]) {
T tmp;
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
ArrShow(a, length);
}
template<class T>
void BubbleSort1(T *a, int length) {
for (int i = 0; i < length - 1; ++i) {
for (int j = length - 2; j >= i; --j) {
if (a[j] > a[j + 1]) {
T tmp;
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
ArrShow(a, length);
}
template<class T>
void BubbleSort2(T *a, int length) {
bool flag = true;
for (int i = 0; i < length - 1; ++i) {
flag = false;
for (int j = length - 2; j >= i; --j) {
if (a[j] > a[j + 1]) {
T tmp;
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
flag = true;
}
}
if (flag == false)
break;
}
ArrShow(a, length);
}
template<class T>
void ArrShow(T *a, int length) {
for (int i = 0; i < length; ++i) {
std::cout << a[i] << " ";
}
puts("\n");
}
template<class T>
void Bubble(T *arr, int len, char *mode, void (*func)(T *a, int length)) {
puts(mode);
func(arr, len);
}
int main(int argc, char *argv[]) {
int test1[9] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
ArrShow(test1, 9);
Bubble(test1, 9, "BubbleSort0 : ", BubbleSort0);
int test2[9] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
Bubble(test2, 9, "BubbleSort1 : ", BubbleSort1);
int test3[9] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
Bubble(test3, 9, "BubbleSort2 : ", BubbleSort2);
return 0;
}