【力扣刷题练习】912. 排序数组

题目描述:

给你一个整数数组 nums,请你将该数组升序排列

题目解答:

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        int len = nums.size();
        for (int i = len / 2 - 1; i >= 0; i--)
            max_heap(nums, i, len - 1);
        for (int i = len - 1; i > 0; i--) {
            swap(nums[0], nums[i]);
            max_heap(nums, 0, i - 1);
        }
        return nums;
    }

private:
    void max_heap(vector<int>& nums, int start, int end) {
        int dad = start, son = 2 * dad + 1;
        while (son <= end) {
            if (son < end && nums[son] < nums[son + 1])
                son++; //选择子节点中最大的
            if (nums[dad] >= nums[son])
                return; //父节点更大,则跳出
            else {      //子节点更大,则交换
                swap(nums[dad], nums[son]);
                dad = son;
                son = 2 * dad + 1;
            }
        }
    }
};

题目思路:

本题使用优化快排、多路归并、堆排序等均可通过。

本处实现了一个使用最大堆排序的算法。首先通过构建最大堆来对数组进行预处理,然后通过不断地将当前未排序部分的最大元素移动到未排序部分的末尾,重新调整最大堆。

max_heap 用于调整从 start 到 end 的部分,使其满足最大堆的性质。这个函数使用 while 循环从父节点开始遍历其子节点,比较子节点和父节点的值,如果父节点的值小于子节点的值,则交换它们的位置。这个过程一直持续到整个子树都满足最大堆的性质。

sortArray 先获取 nums 的长度,然后从数组的中间开始向前遍历,对每个元素调用 max_heap 函数以保持最大堆性质。接下来,它从数组的末尾开始向前遍历,每次都交换堆顶元素(即当前未排序部分的的最大元素)和当前元素,然后重新调整最大堆。这个过程一直持续到整个数组都排好序。

你可能感兴趣的:(力扣刷题练习,算法,数据结构,leetcode)