目录

0912:排序数组(★)

力扣第 912 题

题目

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

分析

#1

最直接的当然是调库。

1
2
def sortArray(self, nums: List[int]) -> List[int]:
    return sorted(nums)

48 ms

#2

可以把经典的排序方法都试一下。 其中选择排序、冒泡排序、插入排序的时间复杂度 O(N^2),会超时。

归并排序:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def sortArray(self, nums: List[int]) -> List[int]:
    def merge(A, B):
        res, i, j = [], 0, 0
        while i < len(A) and j < len(B):
            if A[i] <= B[j]:
                res.append(A[i])
                i += 1
            else:
                res.append(B[j])
                j += 1
        return res + A[i:] + B[j:]

    n = len(nums)
    return nums if n < 2 else merge(self.sortArray(nums[:n//2]), self.sortArray(nums[n//2:]))

420 ms

快速排序:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
def sortArray(self, nums: List[int]) -> List[int]:
    def quick_sort(l, r):
        if l < r:
            k = random.randint(l, r)
            nums[l], nums[k] = nums[k], nums[l]
            pivot, i, j = nums[l], l, r
            while i < j:
                while i < j and nums[j] >= pivot:
                    j -= 1
                while i < j and nums[i] <= pivot:
                    i += 1
                nums[i], nums[j] = nums[j], nums[i]
            nums[l], nums[j] = nums[j], pivot
            quick_sort(l, i - 1)
            quick_sort(i + 1, r)

    quick_sort(0, len(nums) - 1)
    return nums

424 ms

堆排序:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
def sortArray(self, nums: List[int]) -> List[int]:
    def heapify(i, end):
        child = 2 * i + 1
        if child+1 < end and nums[child] < nums[child+1]:
            child += 1
        if child < end and nums[i] < nums[child]:
            nums[i], nums[child] = nums[child], nums[i]
            heapify(child, end)

    n = len(nums)
    for i in range(n, -1, -1):
        heapify(i, n)
    for end in range(n-1, 0, -1):
        nums[0], nums[end] = nums[end], nums[0]
        heapify(0, end)
    return nums

860 ms

#3

本题的数据范围相对于数组长度来说不大,适合用计数排序。

解答

1
2
3
4
5
def sortArray(self, nums: List[int]) -> List[int]:
    res, ct = [], Counter(nums)
    for val in range(min(ct), max(ct)+1):
        res.extend([val]*ct[val])
    return res

100 ms