20分钟回顾基础排序与二分查找

来源:互联网 发布:仿快手源码 编辑:程序博客网 时间:2024/05/17 08:25

来来,复习基础的数据结构吧~~

知乎上有人讲,如果只是应付面试,重要程度:
数据结构:二叉树>散列表>栈>队列>堆>一般树>图>其他
算法:二分法>冒泡>快速排序>加密算法>其他排序算法>随机数的算法>其他

下面需要20分钟就能 浏览完,最最基础的:基本排序与二分查找~~

排序

#插入排序def insertion_sort(nums):    for i in range(1,len(nums)):        key=nums[i]        #把nums[i],插入到已经排序好的nums[0,…,i-1]中        j=i-1        while j>=0 and nums[j]>key:            nums[j+1]=nums[j]            j-=1        nums[j+1]=key    return#冒泡排序def bubble_sort(nums):    for i in range(len(nums)):        for j in range(i+1,len(nums)):            if nums[i]>nums[j]:                nums[i],nums[j]=nums[j],nums[i]    return#快速排序def quicksort(nums,p,r):    if p<r:        q=partition(nums,p,r)        print(p, q, r)        quicksort(nums,p,q-1)        quicksort(nums,q+1,r)    returndef quicksort2(nums,p,r):    #非递归实现,只需要申请一个 栈来记录 需要排序的起始位置与终点位置    stack=[p,r]    while stack:        new_r=stack.pop()        new_p=stack.pop()        q=partition(nums,new_p,new_r)        if new_p<q-1:            stack.extend([new_p,q-1])        if new_r>q+1:            stack.extend([q+1,new_r])    return numsdef partition(nums,p,r):    x=nums[r]    i=p-1  #记录位置    for j in range(p,r):         if nums[j]<=x:             i+=1             nums[i],nums[j]=nums[j],nums[i]    nums[i+1], nums[r] = nums[r], nums[i+1]    return i+1

二分查找

#非递归def search2(a, m):    low = 0    high = len(a) - 1    while low <= high:        mid = (low + high) //2        midval = a[mid]        if midval < m:            low = mid + 1        elif midval > m:            high = mid - 1        else:            print(mid)            return mid    print(- 1)    return -1#递归def search(a,m,low,high):    while low<=high:        mid=(low+high)//2        midval = a[mid]        if midval < m:           return search(a,m,mid+1,high)        elif midval > m:            return search(a, m,low, mid - 1)        else:            print(mid)            return mid    print (-1)    return -1

模块 bisect:
这个模块只有几个函数,一旦决定使用二分搜索时,立马要想到使用这个模块.

    >>>import bisect
    >>>dir(bisect)
    [‘builtins‘, ‘cached‘, ‘doc‘, ‘file‘, ‘loader‘, ‘name‘, ‘package‘, ‘spec‘, ‘bisect’, ‘bisect_left’, ‘bisect_right’, ‘insort’, ‘insort_left’, ‘insort_right’]

举例说明:
“`python
L = [1,3,3,6,8,12,15]
x=4
bisect.insort(L,x)#插入   L则变为[1, 3, 3, 4, 6, 8, 12, 15]
bisect.bisect(L,x)#返回应该插入的位置 L不变

0 0