挖坑填数+分治法
(针对特殊测试用例:顺序数组或者逆序数组)一定要随机化选择切分元素(pivot),否则在输入数组是有序数组或者是逆序数组的时候,快速排序会变得非常慢(等同于冒泡排序或者「选择排序」);
class Solution:
def sortArray(self, nums: List[int]) -> List[int]:
def Adjustarray(nums,i,j):
idx = random.randint(i,j) #随机选取基准
nums[i],nums[idx] = nums[idx],nums[i]
pos = nums[i]
while i<j:
while i<j: #从后往前
if pos>nums[j]:
nums[i]=nums[j]
break
else:
j-=1
while i<j: #从前往后
if pos<nums[i]:
nums[j]=nums[i]
break
else:
i+=1
nums[i]=pos
return i
def quicksort(nums,l,r):
if l<r:
i = Adjustarray(nums,l,r)
quicksort(nums,l,i-1)
quicksort(nums,i+1,r)
quicksort(nums,0,len(nums)-1)
return nums
class Solution:
#快速排序 从小到大
#若x+y<y+x 则x<y
#若x+y>y+x 则x>y
#比较大小采用字符串比较,从高位开始按ascii值比较
def minNumber(self, nums: List[int]) -> str:
def quicksort(l,r):
if l>=r:
return
i,j=l,r
pos=strs[i] #将l位置元素作为基准 [i]挖坑
while i!=j:
while i!=j:
if strs[j]+pos<pos+strs[j]: #strs[j]<pos 则strs[j]前移到[i]位置
strs[i]=strs[j] #[i]填坑 [j]挖坑
i+=1
break
else:
j-=1 #向前搜索
while i!=j:
if strs[i]+pos>pos+strs[i]: #strs[i]>pos 则strs[i]前移到[j]位置
strs[j]=strs[i] #[j]填坑 [i]挖坑
j-=1
break
else:
i+=1 #向后搜索
strs[i]=pos #至此,从l到i-1<i<从i+1到r
quicksort(l,i-1) #分治
quicksort(i+1,r)
strs = [str(num) for num in nums]
l,r=0,len(nums)-1
quicksort(l,r)
return ''.join(strs)