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

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

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

下面需要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)
    return

def 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 nums

def 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值