#include<iostream>
#include<vector>
using namespace std;
void adjust(vector<int>& nums,int pos) {
while(pos > 0) {
int parent = (pos - 1) / 2;
if(pos & 0x1 != 1) {//偶数节点,需要与奇数节点比较
if(nums[pos] < nums[pos - 1]) pos -= 1;
}
if(nums[pos] >= nums[parent]) {
swap(nums[pos],nums[parent]);
pos = parent;
}else break;
}
}
void heapSort(vector<int>& nums,int left,int right) {
if(left < 0 || right > nums.size()) return;
while(left < right) {
adjust(nums,left++);
}
}
int main()
{
//vector<int>vt({1,7,4,6,2,8,5,3});
//vector<int>vt({1,7,4,6,2,8,5,3});
vector<int>vt({1,3,3,3,3,3,3,8});
heapSort(vt,0,vt.size());
for(auto i :vt) {
cout<<i<<' ';
}
}
adjust那里相当于是一堵墙,确保i之前的数据已经经过堆排序的,然后i一直进行到最后一个数字,则确定好了。记住那堵墙就好了。