文章目录
深入理解递归 - 1
归并排序
912. 排序数组
给你一个整数数组 nums,请你将该数组升序排列。
这个归并排序写了2天才看着答案写出来的,真是不容易。就是因为之前没有认真的练习,当时只写了快速排序的代码,忽视了归并排序,之前偷的懒,现在全都要补回来。。。
def sortArray(self, nums: List[int]) -> List[int]:
def merge(left, mid, right, li):
temp = []
i, j = left, mid + 1
while i <= mid and j <= right:
if li[i] < li[j]:
temp.append(li[i])
i += 1
else:
temp.append(li[j])
j += 1
while i <= mid:
temp.append(li[i])
i += 1
while j <= right:
temp.append(li[j])
j += 1
li[left:right+1] = temp
def sort(left, right, li):
if left < right:
mid = (left + right) // 2
sort(left, mid, li)
sort(mid+1, right, li)
merge(left, mid, right, li)
return li
else: return li
left, right = 0, len(nums) - 1
return sort(left, right, nums)
快速排序
K神的快排:
class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
def quick_sort(arr, l, r):
# 子数组长度为 1 时终止递归
if l >= r: return
# 哨兵划分操作(以 arr[l] 作为基准数)
i, j = l, r
while i < j:
while i < j and arr[j] >= arr[l]: j -= 1
while i < j and arr[i] <= arr[l]: i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[l], arr[i] = arr[i], arr[l]
# 递归左(右)子数组执行哨兵划分
quick_sort(arr, l, i - 1)
quick_sort(arr, i + 1, r)
quick_sort(arr, 0, len(arr) - 1)
return arr[:k]