《图解算法》--二分查找选择排序递归
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的增速度量的
三、数组与链表
数组
在内存中,数组是一块连续的区域,对内存空间要求高,必须有足够的连续内存空间,可能浪费内存
数组大小固定,不能动态扩展
链表
内存利用率高,不会浪费内存
大小不固定,扩展很灵活
插入和删除速度很快O(1),查询效率低O(n)
四、选择排序
思路
把数组(长度为n)中的元素按照从大到小的顺序排序。
遍历数组,找到最大的元素,然后移除,时间O(n)。
遍历数组,找到最大的元素,然后移除,时间O(n-1).
依次类推,直到元素全部移除。
时间应该是[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)
栈(先进后出)
递归调用栈
以上是关于《图解算法》--二分查找选择排序递归的主要内容,如果未能解决你的问题,请参考以下文章