question:
解法:快排
class Solution:
def sortArray(self, nums: List[int]) -> List[int]:
def quick(left, right):
if left>= right:
return
# 先取一个基数 ,可以是第一个也可以是最后一个
tem=nums[left]
i=left
j=right
while i <j:
# 从后往前找比tem小的数的前提是nums[j]比tem大,找到了就与空格进行交换
# 此时空格变成了j的位置
while i <j and nums[j] >=tem:
j-=1
nums[i] = nums[j]
# 从前往后找比tem大的数的前提是nums[ii]比tem小,找到了就与空格进行交换
# 此时空格变成了i的位置
while i <j and nums[i] <= tem:
i+=1
nums[j] = nums[i]
# 交替找之后空格的位置就是放最开始的tem
nums[i] = tem
# 然后以tem为间隔,左边比他小,右边比他大,再左右进行一次排序
# 左边排序,调用快排的方法
quick(left,i-1)
# 右边排序,调用快排的方法
quick(i+1,right)
# 给left和right赋值
quick(0,len(nums)-1)
return nums
但是这种方法就明显超时了
我们加上一个random.randint就会没有这个问题
class Solution:
def sortArray(self, nums: List[int]) -> List[int]:
def partition(left, right):
if left >= right:
return
# random.randint取到值的是闭区间,这样就限制了大小,结果不会超出时间限制
idx = random.randint(left, right)
nums[left], nums[idx] = nums[idx], nums[left]
i=left
j=right
while i <j:
while i <j and nums[j] >=nums[left]:
j-=1
while i <j and nums[i] <= nums[left]:
i+=1
nums[j],nums[i] = nums[i],nums[j]
# 交替找之后空格的位置就是放最开始的tem
nums[i],nums[left] = nums[left],nums[i]
partition(left,i-1)
partition(i+1,right)
partition(0,len(nums)-1)
return nums