美文网首页
LeetCode912 使用堆排序解决

LeetCode912 使用堆排序解决

作者: honehou | 来源:发表于2020-06-01 22:00 被阅读0次

堆排序

给你一个整数数组 nums,请你将该数组升序排列。
示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

public class HeapSort {

    public static void main(String[] args) {
        int[] nums = new int[]{5, 2, 3, 1};
        sortArray(nums);
        for (int i : nums) {
            System.out.println(i);
        }
    }

    public static int[] sortArray(int[] nums) {
        // 由于堆排序第一个元素为空,先做转换,将第一个元素设置为空
        int n = nums.length + 1;
        int[] newNums = new int[n];
        for (int i = 1; i < n; i++) {
            newNums[i] = nums[i - 1];
        }
        // 堆化
        bulidHeap(newNums, n-1);
        // 排序,每次都将堆顶元素与堆尾交换,再自上而下堆化
        int k = n-1;
        while (k > 1) {
            swap(newNums, 1, k);
            k--;
            heapify(newNums, k, 1);
        }
        // 转化结果
        for (int i = 0; i < n - 1; i++) {
            nums[i] = newNums[i + 1];
        }
        return nums;
    }

    /**
     * 对整个数组堆化
     * @param nums 数组
     * @param n 堆中的数据个数,下标为0的不算
     */
    public static void bulidHeap(int[] nums, int n) {
        for (int i = n / 2; i > 0; i--) {
            heapify(nums, n, i);
        }
    }

    /**
     * 对单个元素,自上而下的堆化
     * @param nums 数组
     * @param n 堆中的数据个数,下标为0的不算
     * @param i 元素所在位置
     */
    public static void heapify(int[] nums, int n, int i) {
        while (true) {
            int maxPos = i;
            if (i*2 <= n && nums[i*2] > nums[i]) maxPos = i*2;
            if (i*2+1 <= n && nums[i*2+1] > nums[maxPos]) maxPos = i*2+1;
            if (maxPos == i) return;
            swap(nums, i, maxPos);
            i = maxPos;
        }
    }

    public static void swap(int[] nums, int i, int j) {
        int x = nums[i];
        nums[i] = nums[j];
        nums[j] = x;
    }
}

相关文章

  • LeetCode912 使用堆排序解决

    堆排序 给你一个整数数组 nums,请你将该数组升序排列。示例 1:输入:nums = [5,2,3,1]输出:[...

  • 排序

    原创 堆排序: 使用visit数组从本质出发获取大顶堆排序。

  • 03-堆排序(Heap Sort)

    堆排序(Heap Sort) 结合上一讲的内容,发现选择排序可以使用堆排序来进行优化。所以堆排序可以认为是对选择排...

  • 堆排序(堆的建立,维护,和排序)

    1、前言 本文使用了Swift语言来实现了堆排序中的三个重要函数:1、维护堆属性;2、建立堆;3、堆排序。 2、代...

  • 堆排序

    目录 1.堆排序介绍 2.堆排序图文说明 3.堆排序的时间复杂度和稳定性 4.堆排序实现 堆排序介绍 堆排序(He...

  • 堆结构、比较器

    比较器的使用 Heap 01 Heap02 03 堆排序 练习题

  • 堆排序

    hello,你好,欢迎来到堆排序!堆排序是典型的数据结构和算法的结合,首先使用数据结构记录了必要的信息,然后算法通...

  • 堆排序---基础篇

    本文主要介绍堆排序的一些基本过程和分析。 大纲 堆排序简介 堆排序代码实现 1. 堆排序简介 1.1 堆排序的存储...

  • 浅谈堆排序[转载]

    原文链接 堆排序可以做什么 首先应该弄清楚堆排序可以解决什么问题,答案是显而易见的:排序。说得通俗点儿就是对一组无...

  • JavaScript 使用 堆排序

    堆 排序 JavaScript 使用 堆 进行对数组的排序 基本的概念 必须是完全二叉树 ((n - 1) 层必须...

网友评论

      本文标题:LeetCode912 使用堆排序解决

      本文链接:https://www.haomeiwen.com/subject/kseezhtx.html