题解 | #排序#
排序
https://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896
#include <vector>
class Solution {
public:
int len = 0; // 记录数组长度
void heapAdjust(vector<int> &arr, int k, int len){
// 堆排序,将以k为根的节点进行调整,选出最大的堆
// tmp用来记录最大值,arr[k]记录每次遍历的最大值,最后会更新为当前子树的最大值
int tmp = arr[k];
// vector索引从0开始,初始值应该+1,索引值的选择很重要哈
for(int i = 2*k + 1;i<len;i = 2*i +1){
// 保证不越界,并找到较大的节点
if(arr[i]<arr[i+1] && i+1 <len)
i++;
// 已经满足最大的值,在根节点,结束循环
if(tmp >= arr[i]){
break;
}
// 继续调整
arr[k] = arr[i];
k = i;
}
// 循环结束,arr[k]为子树中的最大节点
arr[k] = tmp;
}
vector<int> MySort(vector<int>& arr) {
// write code here
len = arr.size();
// 一直调整到根节点
for(int i = len/2 - 1;i>=0;i--)
// 用于保存子树,对子树进行循环调整
heapAdjust(arr, i, len);
for(int i=len-1;i>0;i--){
swap(arr[0], arr[i]);
// 调整堆以保持最大堆性质
heapAdjust(arr, 0, i);
}
return arr;
}
};