冒泡排序 算法
算法思路:
- 從第一個元素開始遍歷,比較當前元素和下一個元素的大小
- 不符合,則交換
- 結束最后一個元素,則重新遍歷
實現:
void bubble_sort(vector<int> &arr) {for (int i = 0;i < arr.size() - 1; ++i) {//交換size - 1次for (int j = 0;j < arr.size() - 1; ++j) {if (arr[j] > arr[j+1]) {swap(arr[j],arr[j+1]);}} }
}
優化一:
每遍歷完一次,查看是否已經提前完成排序
void bubble_sort(vector<int> &arr) {bool judge = false;for (int i = 0;i < arr.size() - 1 && !judge; ++i) {judge = true;for (int j = 0;j < arr.size() - 1; ++j) {if (arr[j] > arr[j+1]) {swap(arr[j],arr[j+1]);judge = false;}}}
}
優化二:
每遍歷完一次,最后一個元素為最終排序,即每次都可以減少一個元素
void bubble_sort(vector<int> &arr) {for (int i = 0;i < arr.size() - 1; ++i) {//交換size - 1次for (int j = 0;j < arr.size() - i; ++j) {if (arr[j] > arr[j+1]) {swap(arr[j],arr[j+1]);}} }
}
優化三:
正向循環移動最大元素到末尾
逆向循環移動最小元素到開頭
void bubble_sort(vector<int>& arr){int beg = 0;int end = arr.size()-1;while(beg<end){int nbeg = beg, nend = end;//正向循環for(int i=beg;i<end;i++){if(arr[i]>arr[i+1]){nend=i;swap(arr[i],arr[i+1]);}}if(nend==end) break;end = nend;//逆向循環for(int i=end; i>beg;i--){if(arr[i]<arr[i-1]){nbeg=i;swap(arr[i], arr[i-1]);}}if(nbeg==beg) break;beg = nbeg;}
}
算法分析
時間復雜度:
逆向排序時最差為 O(n^2),即每個元素都需要交換
空間復雜度:
O(1),swap時的臨時變量
總結