1. 程式人生 > >排序演算法1——圖解氣泡排序及其實現(三種方法,基於模板及函式指標)

排序演算法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; }