1.二分法
利用元素间次序关系,将元素集进行对半查询
时间复杂度O(logn)
思路:二分法遍历数组,直到找到数组下标与元素不符的情况
if nums == []:
return 0
if nums[-1]==len(nums)-1:
return len(nums)
left = 0
right = len(nums)-1
while left<right:
if nums[(left+right)//2] != (left+right)//2:
right=(left+right)//2
else:
left = (left+right)//2+1
return left
2.快速排序
a.将基准元素分解为a[p,q-1] a[q] a[q+1:],使得a[p:q-1]中任意一个元素小于a[q],右边任意一个元素大于
b.递归排序
*关键在于尽可能低复杂度地获得排序,mid为中位数
class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
#快排,保证mid是中间数
def quicksort(a,p,r):
if p < r:
loc=p
for i in range(p+1,r+1):
if a[i]< a[p]:
loc+=1
print(loc,i)
if i != loc:
a[i],a[loc]=a[loc],a[i]
a[p],a[loc]=a[loc],a[p]
if loc>p:
quicksort(a,p,loc-1)
if loc<r:
quicksort(a,loc+1,r)
quicksort(arr,0,len(arr)-1)
#print(arr)
return arr[0:k]
3.合并排序
将元素集分成大小接近的两个子集和,分别对两个子集和进行排序,最终将排好的子集和合并到所要求的排好序的集合
时间复杂度为O(nlogn)
def merge(a,b,left,right):
mid=(left+right)//2+1
i,j=left,mid
while i < mid and j <=right:
if a[i]<=a[j]:
b.append(a[i])
i+=1
else:
b.append(a[j])
j+=1
b.extend(a[i:mid])
b.extend(a[j:right+1])
a[left:right+1]=b
def mergesort(a,left,right):
b=[]
if left <right:
mergesort(a,left,(left+right)//2)
mergesort(a,(left+right)//2+1,right)
merge(a,b,left,right)
mergesort(nums1,0,len(nums1)-1)
mergesort(nums2,0,len(nums2)-1)
4.冒泡排序
把相邻元素依次比较,大的放右边,依次循环
时间复杂度O(n^2)
def sort(a):
for i in range(len(a)):
#每次排序后使得最大值在后面,已排序的不再排序,保证j在最大值获得最大
for j in range(len(a)-i-1):
if a[j]>a[j+1]:
a[j],a[j+1]=a[j+1],a[j]
sort(nums1)