zoukankan      html  css  js  c++  java
  • 常用的-->查找算法与排序算法

    顺序查找
    从列表第一个元素开始,顺序进行搜索,直到找到为止。
    
    二分查找
    从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。
    li = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    val = 5
    def search(li, val):
        low = 0
        high = len(li) - 1
        while low <= high:
            mid = (low + high) // 2
            if val == li[mid]:
                return mid
            elif val < li[mid]:
                high = mid + 1
            else:
                low = mid - 1
        return 'no'
    
    print(search(li, val))
    排序low B三人组:
    冒泡排序
    # 最好情况O(n) 平均情况O(n^2) 最坏情况O(n^2)
    li = [1, 12, 4, 7, 88, 22, 4, 8, 23]
    
    for i in range(len(li) - 1):
        exchange = False
        for j in (range(len(li) - i - 1)):
            # 前一项与后一项比大小,大的交换排到后边去
            if li[j] > li[j + 1]:
                li[j], li[j + 1] = li[j + 1], li[j]
                exchange = True
        if not exchange:
            break
    
    print(li)
    选择排序

    li = [1, 12, 4, 7, 88, 22, 4, 8, 23]
    
    for i in range(0, len(li) - 1):
        mini = i
        for j in range(i, len(li)):
            # 选择一个最小的记录
            if li[j] < li[mini]:
                mini = j
        # 将当前位置于最小的交换
        li[i], li[mini] = li[mini], li[i]
    print(li)
    插入排序
    li = [1, 12, 4, 7, 88, 22, 4, 8, 23]
    for i in range(1, len(li)):
        tem = li[i]
        j = i - 1
        # 取一个数,插入到比他小的数的位置的后边,其他的数的下标向后移动
        while j > 0 and li[j] > tem:
            li[j + 1] = li[j]
            j -= 1
        li[j + 1] = tem
    print(li)
    排序NB三人组:
    快速排序
    import random
    
    
    def quick_sort(li, left, right):
        if left < right:
            mid = partition(li, left, right)
            # 左边排序
            quick_sort(li, left, mid - 1)
            # 右边排序
            quick_sort(li, mid + 1, right)
    
    
    # 大小数据分开,返回下角标
    def partition(li, left, right):
        tem = li[left]
        while left < right:
            while li[right] >= tem and left < right:
                right -= 1
            li[left] = li[right]
            while li[left] <= tem and left < right:
                left += 1
            li[right] = li[left]
        li[left] = tem
        return left
    
    
    # 减少递归深度[1000,999,....,0]
    def random_partition(li, left, right):
        i = random.randint(left, right)
        li[i], li[left] = li[left], li[i]
        return partition(li, left, right)
    
    
    if __name__ == '__main__':
        li = [random.randint(0, 10000) for i in range(1000)]
        print(li)
        quick_sort(li, 0, len(li) - 1)
        print(li)

     更快的方法(空间复杂度-高)

    def quick_sort2(li):
        if len(li) < 2:
            return li
        tmp = li[0]
        left = [v for v in li[1:] if v <= tmp]
        right = [v for v in li[1:] if v > tmp]
        left = quick_sort2(left)
        right = quick_sort2(right)
        return left + [tmp] + right
    
    堆排序
    归并排序
    没什么人用的排序:
    基数排序
    希尔排序
    桶排序
  • 相关阅读:
    简单使用Git和Github来管理自己的代码和读书笔记
    js中的事件委托
    join和split的区别
    浮动的清除方式
    图片代替多选(单选)按钮
    js和jquery实现简单的选项卡
    闭包——之初理解
    Django REST framework+Vue 打造生鲜超市(七)
    Django REST framework+Vue 打造生鲜超市(六)
    Django REST framework+Vue 打造生鲜超市(五)
  • 原文地址:https://www.cnblogs.com/ls1997/p/10931790.html
Copyright © 2011-2022 走看看