递归:(正常的递归表演满足下面两点)
1、调用自身
2、结束条件
Python中的列表查找:
输入:列表,待查找的元素
输出:返回下标,没有就返回None
顺序查找(线性查找):就是从列表的第一个元素查找到最后一个元素
代码实现:
第一种:
第二种:
时间复杂度:O(n)
二分查找(折半查找):
使用前提:必须是顺序列表(升序or降序)
简单讲解思路:
根据左右下标指针首先算出中间下标对应的值,然后将该值与要查找的元素比较;
if该值大于查找元素,说明要在查找的元素在该值的左面;
所以要将右边的下标移到该值的左边一个,定义新的查找范围;
且每次的查找范围变为之前的一般,依次查找,直到查找到最后一个指针......
循环查找条件:
左右下标指针不能交叉,但是可以相等,指向最后一个元素。 left<=right
注意:
mid要写循环条件下,每次的mid要更新,根据mid下标对应列表的值与查找元素比较;
根据左右指针下标来调整mid的位置,进而调整。
时间复杂度:O(logn)
显然:
二分查找的效率要高于线性查找,前提是顺序列表之中。
排序:
定义:将无序的列表排成有序的列表
针对列表进行排序(主要是升降序)
输入:列表
输出:有序列表
Python内置函数sort()
常见的九大排序:
(冒泡、选择、插入)(快速、堆、归并)(希尔、计数、基数)
()从左往右依次牛批
先来看看low逼的冒泡排序:
冒泡排序的简单原理:
先分趟数,再分次数(分为有序区和无序区)
指针从第一个数一直指到无序区的最后一个数,这就叫一趟。
规律:每完成一趟,有序区就多一个数,无序区就少一个数。
注意:指针从第一个数依次完后走,不会停下!!!
例如:
3,4,5,2,1
第一趟:
- 3,4,5,2,1
- 3,4,5,2,1
- 3,4,2,5,1
3,4,2,1,5 第一趟结束
第二趟:
- 3,4,2,1,5
- 3,2,4,1,5
3,2,1,4,5第二趟结束
第三趟:
- 2,3,1,4,5
2,1,3,4,5第三趟结束
第四趟:
1,2,3,4,5
不难看出:
规律就是,假设列表长度是n=len(list)
趟数:n-1 每趟完成后有序区就多一个数(这里以升序为例)
每趟次数:n-1-有序区的数(或者理解为减去已经完成了多少趟?)
代码:
结果显示:
思考改进:
假如我生成的列表一来就是升序呢?或者代码执行未完成前就已经有序呢?那还执行这么重复的工作是不是不太靠谱?
这里可以增加一个标志位
看看:
这样是不是让效率更高,增加了一个校验,注意:是每一趟结束了校验的!!!
那冒泡排序的时间复杂度呢:
时间复杂度:O(n^2)
代码关键点:
趟、无序区范围
希望大家看到这篇文章有所收获、后面陆续发出其他排序算法。