堆排序 :堆排序的时间复杂度为O(nlogn)
图解参考:https://www.cnblogs.com/wanglei5205/p/8733524.html
#include "iostream"
#include<vector>
using namespace std;
//递归的方式构建大根堆 :父节点的值大于两个子节点
//通过index可以知道 父节点的下标为 (index -1)/2
void adjust(vector<int> &arr,int len,int index){
if(index>=len){
return;
}
int left=2*index+1; //左子节点下标 2*index+1
int right=2*index+2; //右子节点 2*index+2
int maxIdx=index; //假设父节点的值 maxidx存储最大值的下标
if(left<len&&arr[left]>arr[maxIdx]) maxIdx=left; //left<len 主要防止left的值大于数组长度
if(right<len&&arr[right]>arr[maxIdx]) maxIdx=right;//同上
if(maxIdx!=index){
swap(arr[maxIdx],arr[index]); //交换两个数的值
adjust(arr,len,maxIdx) ; //递归调用
}
}
//堆排序
void heapSort(vector<int> &arr,int size){
for(int i=size/2-1;i>=0;i--){ // size/2-1 是每个父节点的下标
adjust(arr,size,i); // 通过遍历父节点 调用方法adjust 实现大数堆
}
for(int i=size-1;i>=1;i--){
swap(arr[0],arr[i]); //先把数组第一个和最后一个数交换 ,再调用adjust重构大数堆
adjust(arr,i,0) ;
}
}
int main()
{ vector<int> arr;
int a[9] = {8,1,14,3 ,21 ,5, 2 ,7,10} ;
for(int i=0;i<sizeof(a)/4;i++){
arr.push_back(a[i]);
}
heapSort(arr, arr.size());
for(int i=0;i<arr.size();i++)
{
cout<<arr[i]<<endl;
}
return 0;
}