列表查找
- 查找:在一些数据元素中,通过一定方法找出与给定关键字相同的数据元素。
- 列表查找:从列表中查找制定元素
- 输入:列表,待查找元素
- 输出:元素的index
顺序查找
从列表第一个元素开始,顺序进行搜索。
def linear_search(li, val):
for ind, v in enumerate(li):
if v == val:
return ind
else:
return None
时间复杂度: O ( n ) O(n) O(n)
二分查找
从有序列表的初始候选区开始查找,从中间值开始查看。(二分法)
def binear_search(li,val):
li = sorted(li)
left = 0
right = len(li)-1
while left <= right: #候选区有值
mid = (left+right)//2
if li[mid] == val:#待查找的值就是mid
return mid
elif li[mid] > val: #待查找的值在mid左边
right = mid-1
elif li[mid] < val: #待查找的值在mid右边
left = mid+1
return None
时间复杂度是
O
(
l
o
g
n
)
O(logn)
O(logn),因此效率比线性查找的效率高。
内置列表查找函数:index()是用线性查找进行的。
因此,有序数列用二分查找较好,无序数列根据要查找次数来决定,如果要进行大量查找,可选用二分查找。
列表排序
列表排序是将“无序”的记录序列调整为“有序”的记录序列。分为升序与降序,内置排序函数sort()。
基础排序方法
冒泡排序
简介:列表每两个相邻的数,如果前面比后面大,则交换这两个数。一趟排序完成后,则无序区减少一个数,有序区增加一个数。
代码关键点为:第几次,无序区是哪些。
def bubble_sort(li):
for i in range(len(li)-1): #i表示第i趟
exchange = False#判断列表是否已经排好序
for j in range(len(li)-i-1):
if li[j]<li[j+1]:
li[j+1],li[j]=li[j],li[j+1]
exchange = True
if not exchange:
return li
return li
时间复杂度: O ( n 2 ) O(n^2) O(n2)
选择排序
最简单版本:从列表中选择最小的元素,添加到新的列表中。
def select_sort_simple(li):
li_new = []
for i in range(len(li)):
min_val = min(li)
li_new.append(min_val)
li.remove(min_val)
return li_new
缺点:生成了两个列表,占用内存(不是原地排序)。时间复杂度很高,为
O
(
n
2
)
O(n^2)
O(n2)。
优化版本:
一趟排列记录最小的数,放到无序区的第一个位置,无序区往后缩短一位。
关键点:有序去和无序区以及无序区最小值的位置在哪里。
def select_sort(li):
for i in range(len(li)-1):
min_loc=i
for j in range(i+1,len(li)):
if li[j] < li[min_loc]:
min_loc = j
li[i],li[min_loc]=li[min_loc],li[i]
print(li)
return li
时间复杂度: O ( n 2 ) O(n^2) O(n2)