排序演算法---氣泡排序
阿新 • • 發佈:2018-12-10
參考網址:https://www.cnblogs.com/onepixel/articles/7674659.html 氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。 演算法描述:
- 比較相鄰的元素。如果第一個比第二個大,就交換它們兩個;
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數;
- 針對所有的元素重複以上的步驟,除了最後一個;
- 重複步驟1~3,直到排序完成。 BubbleSort函式是氣泡排序基礎版 BubbleSort1是氣泡排序改進版,即雞尾酒排序,也叫定向氣泡排序,是氣泡排序的一種改進。此演算法與氣泡排序的不同處在於從低到高然後從高到低,而氣泡排序則僅從低到高去比較序列裡的每個元素。他可以得到比氣泡排序稍微好一點的效能。 程式碼如下:
#include<iostream> using namespace std; // 分類 -------------- 內部比較排序 // 資料結構 ---------- 陣列 // 最差時間複雜度 ---- O(n^2) // 最優時間複雜度 ---- 如果序列在一開始已經大部分排序過的話,會接近O(n) // 平均時間複雜度 ---- O(n^2) // 所需輔助空間 ------ O(1) // 穩定性 ------------ 穩定 void Swap(int arr[], int i, int j) { int temp = arr[j]; arr[j] = arr[i]; arr[i] = temp; } //氣泡排序基礎版 void BubbleSort(int arr[], int n) { if (arr == NULL) { cout << "陣列為空,無法排序!" << endl; } for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { if (arr[j]>arr[j + 1]) // 如果條件改成A[i] >= A[i + 1],則變為不穩定的排序演算法 { Swap(arr, j, j + 1); } } } } //氣泡排序改進版 void BubbleSort1(int arr[], int n) { int left = 0; // 初始化邊界 int right = n - 1; while (left < right) { for (int i = 0; i < right-1; i++) // 前半輪,將最大元素放到後面 { if (arr[i]>arr[i + 1]) { Swap(arr, i, i + 1); } } right--; for (int j = right; j > left; j--) // 後半輪,將最小元素放到前面 { if (arr[j] > arr[j + 1]) { Swap(arr, j, j + 1); } } left++; } } int main() { int arr[] = { 2, 3, 7, 9, 2, 1, 4, 6, 5 }; int n = 9; BubbleSort1(arr, n); for (int i = 0; i < n; i++) { cout << arr[i] << endl; } return 0; }