• 912. 排序数组(堆排序)


    堆排序

    • 声明全局堆长度
    • 建堆(大顶堆)
    • 从最后一个元素开始向前遍历,进行:1. 交换最后元素和堆顶元素;2. 全局堆长度-1;3. 调整大顶堆(从第0个位置开始)

    建堆:
    从nums.length/2-1的元素开始向前遍历,调整每个元素作为堆顶元素的堆

    调整堆:

    • 找到i的左右子节点的位置left和right
    • 分别比较left和i、right和i谁更大,用largest指向
    • 如果largest=i,表明已经是个大顶堆,否则,交换largest和i位置的元素,递归调整largest作为堆顶元素的堆
    class Solution {
        static int heapLen;
    
        public int[] sortArray(int[] nums) {
            heapSort(nums);
            return nums;
        }
    
        public void heapSort(int[] nums) {
            heapLen = nums.length;
            buildHeap(nums);
            // for (int i = heapLen - 1; i > 0; --i) {
            for (int i = nums.length - 1; i > 0; --i){
                swap(nums, 0, i);
                --heapLen;
                // adjustHeap(nums, i);
                adjustHeap(nums, 0);
            }
        }
    
        public void buildHeap(int[] nums) {
            for (int i = nums.length / 2 - 1; i >= 0; --i) {
                adjustHeap(nums, i);
            }
        }
    
        public void adjustHeap(int[] nums, int i) {
            int left = 2 * i + 1;
            int right = 2 * i + 2;
            int largest = i;
            // if (left < heapLen && nums[left] > nums[largest]) largest = left;
            if (right < heapLen && nums[right] > nums[largest]) largest = right;
            if (left < heapLen && nums[left] > nums[largest]) largest = left;
            if (largest != i) {
                swap(nums, i, largest);
                adjustHeap(nums, largest);
            }
        }
    
        public void swap(int[] nums, int i, int j) {
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
  • 相关阅读:
    【opencv】Opencv中数据类型CV_8U, CV_16U, CV_16S, CV_32F、CV_64F
    根据文件扩展名进行排序
    windows使用命令行创建文件echo >test.txt(可以是.gp .js .ts..)
    VictoriaMetrics之vm-operator
    你的Linux进阶之旅,终点是何处?
    FSCTF 2023(公开赛道)CRYPTO WP
    php定时任务
    OneFlow源码解析:静态图与运行时
    9.Mybatis的缓存
    PlantUml 思维导图学习
  • 原文地址:https://blog.csdn.net/qq_43606119/article/details/136406943