LeetCode #912 排序数组
题目描述
给定一个整数数组 nums
,将该数组升序排列。
示例 1:
输入:[5,2,3,1]
输出:[1,2,3,5]
示例 2:
输入:[5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
提示:
1 <= A.length <= 10000
-50000 <= A[i] <= 50000
方法一:简易快排
方法一:简易快排
class Solution:
def sortArray(self, nums: List[int]) -> List[int]:
def quickSort(arr):
if not arr: return []
base = arr[0]
left = quickSort([x for x in arr[1:] if x <= base])
right = quickSort([x for x in arr[1:] if x > base])
return left + [base] + right
random.shuffle(nums)
return quickSort(nums)
方法二:堆排序
class Solution:
def sortArray(self, nums: List[int]) -> List[int]:
def shif_down(arr, index, n):
while 2 * index <= n:
child = 2 * index
if child + 1 <= n and arr[child] < arr[child + 1]:
child += 1
if arr[index] < arr[child]:
arr[index], arr[child] = arr[child], arr[index]
index = child
else:
break
def heap_sort(arr):
if not arr: return []
# 创建堆
arr = [None] + arr
# 变成大顶堆
index = (len(arr) - 1) // 2
while index > 0:
shif_down(arr, index, len(arr) - 1)
index -= 1
# 把堆顶放到最后面,再调整堆
n = len(arr) - 1
while n > 1:
arr[1], arr[n] = arr[n], arr[1]
n -= 1
shif_down(arr, 1, n)
return arr[1:]
return heap_sort(nums)
方法三:归并排序
class Solution:
def sortArray(self, nums: List[int]) -> List[int]:
def merge_sort(lst):
# if not lst: return [] 递归超出python层数限制
if len(lst) < 2: return lst
# mid = lst // 2 接近超时
mid = math.floor(len(lst) / 2)
left = merge_sort(lst[:mid])
right = merge_sort(lst[mid:])
return merge(left, right)
def merge(left, right):
res = []
while left and right:
if left[0] < right[0]:
res.append(left.pop(0))
else:
res.append(right.pop(0))
return res + left + right
return merge_sort(nums)