题解 | #排序#

排序

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;
    }
};

全部评论

相关推荐

牛客ID:561366855:期望薪资多少?难以相信这简历找不到工作。说明二本电子信息专业想对口就业非常难。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务