排序算法小结

1.二分法
利用元素间次序关系,将元素集进行对半查询
时间复杂度O(logn)
排序算法小结_第1张图片
思路:二分法遍历数组,直到找到数组下标与元素不符的情况

 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为中位数
排序算法小结_第2张图片

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)

你可能感兴趣的:(算法,排序算法,快速排序,算法,二分法)