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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

堆排序(C++版)

發布時間:2024/4/18 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆排序(C++版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//堆排序->完全二叉樹 //時間復雜度都是nlogn 空間復雜度是O(n)#include <iostream> #include <vector> using namespace std;void print(vector<int>& nums){for(auto a: nums){cout<<a<<" ";}cout<<endl; }//對每個節點做heapify操作 void heapify(vector<int>& nums,int n,int i){int c1=2*i+1;//求當前節點的左孩子下標int c2=2*i+2;//求當前節點的右孩子下標int max=i;//先假設當前節點是最大值//因為做heapify操作要保證左右孩子節點下標要在正確范圍內if(c1<n&&nums[c1]>nums[max]){max=c1;}if(c2<n&&nums[c2]>nums[max]){max=c2;}if(max!=i){swap(nums[max],nums[i]);heapify(nums,n,max);} }//對完全二叉樹的每個節點做heapify操作,從而建立起大根堆 //從最后一個節點的父節點開始,最后一個節點的下標n-1。 void heapify_build(vector<int>& nums,int n){for(int ii=(n-1)/2;ii>=0;ii--){heapify(nums,n,ii);} } void heapify_sort(vector<int>& nums){int n=nums.size();heapify_build(nums,n);//首先建立大根堆for(int ii=0;ii<n;ii++){swap(nums[0],nums[n-ii-1]);//每次交換最后一個節點和根節點。heapify(nums,n-ii-1,0);//對交換后的節點繼續進行heapify。注意n變為n-1,動態遞減需要變量ii來控制} }int main(){//vector<int> nums{1,24,67,23,4,78,90,456};vector<int> nums{1,3,2,58,5,6,43,54,65,55,55,55};heapify_sort(nums);print(nums);return 0; }

總結

以上是生活随笔為你收集整理的堆排序(C++版)的全部內容,希望文章能夠幫你解決所遇到的問題。

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