1.快速排序
def quicksort(nums):
def helper(first, last):
if first < last:
splitpoint = partition(first, last)
helper(first, splitpoint - 1)
helper(splitpoint + 1, last)
def partition(first, last):
mid = nums[first]
left = first + 1
right = last
while left <= right:
if nums[left] > mid and nums[right] < mid:
nums[left], nums[right] = nums[right], nums[left]
if nums[left] <= mid:
left += 1
if nums[right] >= mid:
right -= 1
nums[first], nums[right] = nums[right], nums[first]
return right
helper(0, len(nums) - 1)
return nums
时间复杂度:o(nlogn),最坏o(n^2),稳定性差
空间复杂度:o(1)
快排可以根据需求通过partition选择左/右部分,而不需要对整个nums排序。(时间复杂度:o(n),最坏o(n^2))
leetcode习题:215
2.归并排序
def mergesort(nums):
if len(nums) == 1:
return nums
mid = len(nums) // 2
left = mergesort(nums[:mid])
right = mergesort(nums[mid:])
merge = []
while left and right:
if left[0] <= right[0]:
merge.append(left.pop(0))
else:
merge.append(right.pop(0))
merge.extend(right if right else left)
return merge
时间复杂度:o(nlogn)(最好最坏都是,所以稳定性好)
空间复杂度:o(n)
感觉思路上比快排简单一点,leetcode上用到归并的题目大部分都是hard,还没有做,做完会总结
leetcode习题:215
3.堆排序