排序

比较排序

HeapSort

  • 第一步:O(N)建立最大堆

  • 第二步:不停地从最大堆中pop出根,in-place的话只需要O(N)的空间

class Solution:
    def heapify(self, nums, n, i):
        # heapify nums[:n] by sinking nums[i] to correct place
        largest = i
        l, r = 2*i+1, 2*i+2
        if l<n and nums[i]<nums[l]:
            largest = l
        if r<n and nums[largest]<nums[r]:
            largest = r
        if largest != i:
            nums[i], nums[largest] = nums[largest], nums[i]
            self.heapify(nums, n, largest)
    
    def sortArray(self, nums: List[int]) -> List[int]:
        n = len(nums)
        for i in range(n>>1, -1, -1):
            self.heapify(nums, n, i)
        
        for i in range(n-1, 0, -1):
            nums[i], nums[0] = nums[0], nums[i]
            self.heapify(nums, i, 0)
        return nums

# 偷懒写法:需要O(N)额外的空间
class Solution:
    def sortArray(self, nums: List[int]) -> List[int]:
        heapq.heapify(nums)
        res = []
        while nums:
            res.append(heapq.heappop(nums))
        return res

MergeSort

QuickSort

  • 自上而下的分治,没有divide & conquer之后的combine那一步

  • 如果每一次partition都拿到最大的一个数,那么最坏的时间复杂度是O(N²)。平均复杂度一般为O(N),而且用随机选择pivot的partition能够摊平时间复杂度。

线性时间排序

Counting Sort

假设已知数据的所有可能

  • 第一步:统计每个数字对应的cumulative count,即最后结果应该在的位置i.e. rank

  • 第二步:在每一个rank的位置填入数字

BucketSort

假设数据的范围,而且分布是均匀的,可以用桶排序。这里选择的数据范围根据例题

Last updated

Was this helpful?