class Solution {
public:
void adjust(vector<int>&nums,int n,int k)//递归调整,每次跟子节点交换后再调整子节点
{
int l=k*2+1;
int r=k*2+2;
int mxk=k;
if(l<n&&nums[l]>nums[mxk])
{
mxk=l;
}
if(r<n&&nums[r]>nums[mxk])
{
mxk=r;
}
if(mxk!=k)
{
swap(nums[k],nums[mxk]);
adjust(nums,n,mxk);
}
}
void Sort(vector<int>& nums)
{
int n=nums.size();
for(int i=n/2-1;i>=0;i--)//从最后一个非叶子节点开始一个个调整
{
adjust(nums,n,i);
}
for(int i=n-1;i>=0;i--)//将根节点放最后去,然后重新调整根节点
{
swap(nums[i],nums[0]);
adjust(nums,i,0);
}
}
vector<int> sortArray(vector<int>& nums) {
Sort(nums);
return nums;
}
};
复杂度分析:
时间复杂度最开始建堆是O(n) ,然后要就行 n-1 次调整,每次调整最多进行树的层数次,即 logn,所以总的复杂度是 O(nlogn)。
交换都是原地交换,额外空间是常数级,所以空间复杂度O(1)。