冒泡排序 算法
算法思路:
- 從第一個(gè)元素開(kāi)始遍歷,比較當(dāng)前元素和下一個(gè)元素的大小
- 不符合,則交換
- 結(jié)束最后一個(gè)元素,則重新遍歷
實(shí)現(xiàn):
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]);}} }
}
優(yōu)化一:
每遍歷完一次,查看是否已經(jīng)提前完成排序
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;}}}
}
優(yōu)化二:
每遍歷完一次,最后一個(gè)元素為最終排序,即每次都可以減少一個(gè)元素
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]);}} }
}
優(yōu)化三:
正向循環(huán)移動(dòng)最大元素到末尾
逆向循環(huán)移動(dòng)最小元素到開(kāi)頭
void bubble_sort(vector<int>& arr){int beg = 0;int end = arr.size()-1;while(beg<end){int nbeg = beg, nend = end;//正向循環(huán)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;//逆向循環(huán)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;}
}
算法分析
時(shí)間復(fù)雜度:
逆向排序時(shí)最差為 O(n^2),即每個(gè)元素都需要交換
空間復(fù)雜度:
O(1),swap時(shí)的臨時(shí)變量
總結(jié)