一、二分查找和线性查找对比
index()是线性查找 因为二分查找要求有序 index()需要适用于所有情况
二分查找的有一个循环减半 所以复杂度是o(log(n))
线性查找的复杂度是o(n)
二、排序
常见的排序算法:
1.low 冒泡排序 选择排序 插入排序
2.猛 快速排序 堆排序 归并排序
3.其他排序 希尔排序 基数排序 计数排序
三、冒泡排序
>列表每两个相邻的数,如果前面比后面大,则交换这两个数
>一趟排序完成后,无序区少一个数,有序区加一个数
如 [1,4,3,2]
1和4比 不变 4和3比 34交换 4和2比42交换,此时叫一趟 这个时候最大的数4到了最后的位置,即4进入了有序区,有序区加一个数,无序区少一个数
在数第几躺的时候 从第0开始
def bubble_sort(li):
for i in range(len(li)-1): #第i趟,range(n)不包括n
for j in range(len(li)-i-1): #指针
if li[j] > li[j+1]:
li[j],li[j+1] = li[j+1],li[j]
算法复杂度是o(n^2)
优化:若一趟中 没有发生交换 则停止
def bubble_sort(li):
for i in range(len(li)-1): #第i趟,range(n)不包括n
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
print(li)
if not exchange:
return
冒泡排序不需要生成新列表 又叫原地排序
四、选择排序
遍历找到需要的数拿出来
def select_sort(li):
for i in range(len(li)-1):
min_loc = i
for j in range(i+1,len(li)): #从i+1遍历因为i处每次都是和min_loc一样的相当于无效比较,直接从下一位开始更好
if li[j] < li[min_loc]:
min_loc = j
li[i],li[min_loc] = li[min_loc],li[i]
五、插入排序
从无序区里随便拿出放在有序区正确的位置
先从牌堆里摸牌 下标为i 摸到后和手里的牌比较 手里的牌倒序查找 从离摸到的牌最近的位置开始找 j = i-1 并每查一次 j -= 1 并且让li[j+1] = li[j]
一个错误示例:
def insert_sort(li):
for i in range (len(li)):
j = i - 1
while j >= 0 and li[j] > li[i]: #如果用li[i],当j+1=i的并且循环了一次的时候li[j+1] = li[j] = li[i] 即数值被改变了,所以要用tmp = li[i]记录数值
li[j+1] = li[j]
j -= 1
li[j+1] = li[i]
正确代码:
def insert_sort(li):
for i in range (len(li)):#i是摸到牌的下标。实际上用range(1,len(i))也行,因为第一个摸出来不需要
j = i -1#j是手上牌的下标
tmp = li[i]#记录摸到牌的值
while j >= 0 and li[j] > tmp:
li[j+1] = li[j]
j -= 1
li[j+1] = tmp