日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

冒泡排序 算法

發布時間:2023/11/27 生活经验 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 冒泡排序 算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法思路:

  1. 從第一個元素開始遍歷,比較當前元素和下一個元素的大小
  2. 不符合,則交換
  3. 結束最后一個元素,則重新遍歷

實現:

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時的臨時變量

總結

以上是生活随笔為你收集整理的冒泡排序 算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。