leetcode
912. 排序数组

问题描述

LeetCode 912. 排序数组 (opens in a new tab),难度中等

给你一个整数数组 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]

提示:

  • 1 <= nums.length <= 5 * 104
  • -5 * 104 <= nums[i] <= 5 * 104

题解

快排

题解:常规的快排过不了所有实例,我选择了【优化基准值 —— 随机选择法】,还是过不了所有实例,后面可以试试三数取中法,即选择数组的首元素、尾元素和中间元素的中位数作为基准值。这种方法可以在一定程度上避免最坏情况的发生,尤其是对于部分有序的数组。

Solution.java
public class Solution {
    public int partitionArray(int[] nums, int low, int high) {
        if (low >= high) return -1;
        int pivot = low, l = pivot + 1, r = high;
        while (l <= r) {
            if (nums[l] < nums[pivot]) ++l;
            else if (nums[r] >= nums[pivot]) --r;
            else swap(nums, l, r);
        }
        swap(nums, pivot, r);
        return r;
    }
 
    public void quickSort(int[] nums, int low, int high) {
        if (low >= high) return;
        Random random = new Random();
        swap(nums, low + random.nextInt(high - low + 1, low);
        int pivot = partitionArray(nums, low, high);
        quickSort(nums, low, pivot);
        quickSort(nums, pivot + 1, high);
    }
 
    public int[] sortArray(int[] nums) {
        quickSort(nums, 0, nums.length - 1);
        return nums;
    }
}

堆排序

题解:由于上面实现的快排过不了所有实例,所以我选择了堆排序过了,借助优先队列实现(真正面试的时候还是要自己写堆排序哦

Solution.java
class Solution {
    public int[] sortArray(int[] nums) {
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for (int i : nums) {
            pq.add(i);
        }
        for (int i = 0; i < nums.length; ++i) {
            nums[i] = pq.poll();
        }
        return nums;
    }
}