堆排序(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++版)
- 下一篇: 归并排序(C++版)