1.快速排序
def divide(nums,start,end):
l,r=start+1,end
while True:
while l<=end and nums[l]<nums[start]:
l+=1
while nums[r]>nums[start]:
r-=1
if l>r:
break
nums[l],nums[r]=nums[r],nums[l]
l+=1
r-=1
nums[start],nums[r]=nums[r],nums[start]
return r
def quickSort(nums,i,j):
if i<j:
m=divide(nums,i,j)
quickSort(nums,i,m-1)
quickSort(nums,m+1,j)
2.分治排序
def merge(nums1,nums2):
res=[]
while nums1 and nums2:
if nums1[0]<=nums2[0]:
res.append(nums1[0])
nums1=nums1[1:]
else:
res.append(nums2[0])
nums2=nums2[1:]
res.extend(nums1 if nums1 else nums2)
return res
def divideAndConquer(nums):
if len(nums)<=1:
return nums
m=len(nums)//2
left=divideAndConquer(nums[:m])
right=divideAndConquer(nums[m:])
return merge(left,right)
3.堆排序
def adjust(nums,i,end):
while 2*i+1<end:
tmp=2*i+1
if 2*i+2<end and nums[2*i+1]<nums[2*i+2]:
tmp=2*i+2
if nums[i]<nums[tmp]:
nums[i],nums[tmp]=nums[tmp],nums[i]
i=tmp
else:
break
def heapSort(nums):
for i in range(len(nums)//2-1,-1,-1):
adjust(nums,i,len(nums))#建堆
for i in range(len(nums)-1,0,-1):
nums[0],nums[i]=nums[i],nums[0]
adjust(nums,0,i)