《图解算法》--二分查找选择排序递归

Posted 大诚笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《图解算法》--二分查找选择排序递归相关的知识,希望对你有一定的参考价值。

二分查找、选择排序、递归

一、二分查找

思路

给定一个有序元素列表,获取要查找元素所在位置索引。
1、目标元素与有序列表的中间位置元素比较大小。
2、如果目标元素大于中间位置元素,取列表的后半部分。
3、如果目标元素小于中间位置元素,取列表的前半部分。
4、循环直至找出目标元素索引。

代码

def binary_search(list_item,item):
    low = 0
    heigh = len(list_item)-1
    while low<heigh:
        mid = math.ceil((low+heigh)/2)
        if list_item[mid] == item:
            return mid
        elif list_item[mid] < item:
            low = mid
        elif list_item[mid] > item:
            heigh = mid
    return None

list_item =  [1,2,3,4,5,6,7,8,9,11,22,33,44,55]
binary_search(list_item,8)

二、大O表示法

常见的大O运行时间

O(log(n)):对数时间,二分查找算法的时间,log(n)在这里表示的是以2为底的n的对数。
O(n):线性时间,简单查找算法的时间。
O(n*log(n)):快速排序算法的时间,log(n)在这里表示的是以2为底的n的对数。
O(n2):选择排序算法的时间,n2为n的平方。

算法的运行时间并不是以秒为单位,算法的运行时间是从其操作数n的增速度量的

三、数组与链表

数组

  1. 在内存中,数组是一块连续的区域,对内存空间要求高,必须有足够的连续内存空间,可能浪费内存

  2. 数组大小固定,不能动态扩展

链表

  1. 内存利用率高,不会浪费内存

  2. 大小不固定,扩展很灵活

  3. 插入和删除速度很快O(1),查询效率低O(n)

四、选择排序

思路

  1. 把数组(长度为n)中的元素按照从大到小的顺序排序。

  2. 遍历数组,找到最大的元素,然后移除,时间O(n)。

  3. 遍历数组,找到最大的元素,然后移除,时间O(n-1).

  4. 依次类推,直到元素全部移除。

  5. 时间应该是[n,n-1,n-2,……2,1],平均时间为n/2*(n+1),忽略1/2,时间为O(n*n)

代码

def find_max(arr):
    max_index = 0
    for i in range(len(arr)):
        if arr[i]>arr[max_index]:
            max_index = i
    return max_index

def select_sort(arr):
    new_arr = []
    for i in range(len(arr)):
        # 每一次遍历都找到最大元素,然后移除
        max_index = find_max(arr)
        new_arr.append(arr.pop(max_index))
    return new_arr

arr = [1,2,3,4,6,7]
new_arr = select_sort(arr)
new_arr

五、递归

基线条件与递归条件

编写递归函数时,必须告诉函数什么时候停止递归,递归条件指函数调用自己,基线条件指函数不在调用自己,避免形成无限循环。

def cut_down(i):
    print(i)
    # 基线条件
    if i<=0:
        return
    # 递归条件
    cut_down(i-1)
cut_down(5)

栈(先进后出)

递归调用栈


以上是关于《图解算法》--二分查找选择排序递归的主要内容,如果未能解决你的问题,请参考以下文章

递归-之二分查找与选择排序算法

《算法图解》读书感悟

图解二分查找的递归和非递归实现

《算法图解》之快速排序

Unity中的快速排序算法&&二分查找

分治法应用之二分查找 快速排序递归排序