排序
比较排序
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 resMergeSort
用分治思路
主要步骤分治后merge结果,需要O(N)的空间。也有in-place的一些方法
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?