记录从准研一假期自学PYTHON的全过程day16(归并排序 各种排序方式比较 二分查找)

68 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

也是暑假自学python的第16天

排序算法

归并排序

归并排序在一般学习的都是两两归并排序,第一次将每两个元素分为一组进行排序,第二次将2*n=4个元素分为一组进行排序,以此,直到将所有元素并为一组。

以下为归并排序的递归代码

'''
归并排序
'''
def merge(self, low, high):
    if low < high:
        mid = (low + high) // 2
        self.merge(low, mid)
        self.merge(mid + 1, high)
        self.merge_arr(low, mid, high)

在归并排序第一次以后要对数组进行合并

合并两个有序数组的方法:

两个数组进行合并,需要创建一个辅助数组,数组1设置标记i,数组2标记j,i与j都是从数组下标为0开始,将i与j进行比较,谁小就放入辅助数组中。而后i++/j++,辅助数组每放入一个元素都要进行+1,以此类推shuzu

如果一个组内的元素全部被放入到辅助数组中,那么另个一个数组还有剩余,直接将其全部复制到辅助数组中:

def merge_arr(self, low, mid, high):
    help_arr=self.help_arr
    arr=self.arr
    for i in range(low,high+1): #把列表内的内容,复制到辅助列表
        help_arr[i]=arr[i]
    i=low
    j=mid+1
    k=low
    while i<=mid and j<=high:
        if help_arr[i]<help_arr[j]:
            arr[k]=help_arr[i]
            k+=1
            i+=1
        # 必须if和else,如果是两个if会访问越界,在第二次if时,访问help_arr[i]就会越界
        else:
            arr[k]=help_arr[j]
            k+=1
            j+=1
    #把某一个剩余的元素都赋值过去
    while i<=mid:
        arr[k] = help_arr[i]
        k += 1
        i += 1

    while j<=high:
        arr[k] = help_arr[j]
        k += 1
        j += 1
时间复杂度

不同排序方式相比较:

image.png

我想这样的一张图就足以总结经常遇到的排序方法了

快速排序较为重要

二分查找

二分查找的时间复杂度为o(log2n)

二分查找的思路就是在一个已经排好序的数组里面,查找a,数组中间的值比他大,则找左边一半,比他小则找右边一半,每次以中间的数字为基准。

具体的代码如下:

def bsearch(arr,target):
    high=len(arr)-1
    low=0
    while low<=high: 
        mid=(low+high)//2
        if arr[mid]>target:
            high=mid-1
        elif arr[mid]<target:
            low=mid+1
        else:
            return mid
    return -1

在排序之后需要查找一个数字,就可以使用二分查找法,时间复杂度较低

今天的学习结束

=======================================================