一、查找
1、查找的概念:
2 顺序查找(linear search)
从头找到尾
def linear_search(li,val): for ind ,v in enumerate(li): if v==val: return ind else: return None
3 二分查找(binary search):
def binary_search(li,val): left = 0 right = len(li)-1 while left<=right: mid = (left+right)/2 if li[mid] == val: return mid elif li[mid] >val: right = mid -1 else: left = mid + 1 else: return None
----------------
------------------------------
二、列表排序
1、什么是列表排序
排序:将一组“无序”的记录序列调整为“有序”的记录序列
列表排序:将无序列表变为有序列表
输入:列表
输出:有序列表
升序和降序
内置排序函数
2、常见排序算法介绍
排序的Low B三人组
时间复杂度都是O(n^2)
3、排序算法分析
冒泡排序(Bubble sort) 走n-1趟
第一次外层循环把最大的一个数移到最后;第二次外层循环把第二大的移到最后
每一次内部循环都从索引为0和1的数的比较
基本思想:对比相邻的元素值,如果满足提条件就交换元素值,把较小的元素移动到数组前面,把较大的元素移动到数组后面,这样较小的的元素就像气泡一样从底部上升到顶部
def bubble_sort(li): for i in range(len(li)-1):# n-1趟 for j in range(len(li)-i-1): # 每一次内部循环需要比较的次数 # if li[j]>li[j+1]: li[j],li[j+1] = li[j+1],li[j] print(li,f'第{i+1}次外部循环 ,内部循环比较次数{len(li)-i-1}') li = [4,2,5,1,7,8,9,3,6] bubble_sort(li)
-------------------------
def bubble_sort(li): for i in range(len(li)-1): for j in range(len(li)-i-1): if li[j]>li[j+1]: li[j],li[j+1] = li[j+1],li[j] # t=li[j] # li[j]=li[j+1] # li[j+1]=t import random # 列表生成式 L = [x * x for x in range(10)] 生成一个list,长度为1000,里面的元素是可以重复的随机数(范围0-10000) li = [random.randint(0,10000) for i in range(1000)] print(li) bubble_sort(li) print(li)
---------------------------
3.2 选择排序(select sort)
每一次循环选出最小的一个
基本思想:将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值,把满足条件的元素与指定的排序位置交换
def select_sort(li): for i in range(len(li)-1): min = i for j in range(min+1,len(li)): if li[min]>li[j]: li[min],li[j] = li[j],li[min] print(li, f'第{i+1}次外部循环 ,内部循环比较次数{len(li)-min-1}') li = [4,2,5,1,7,8,9,3,6] select_sort(li) print(li)
li = [3,2,4,1,5,6,8,7,9] 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 print('select_sort_simple',select_sort_simple(li)) 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) select_sort(li)
-------------------------------
复杂度:0(n^2)
3.3 插入排序
基本思想:将一个记录插入到已排好序的有序表中,从而得到一个新的,记录数增1的有序表,然后再从剩下的关键字中选取下一个插入对象,反复执行直到整个序列有序。
def insert_sort(li): for i in range(1,len(li)): tem = li[i] # 要插入的数 j = i-1 # j指的是手里的牌的下标 while li[j] > tem and j>=0: li[j+1] = li[j] j -= 1 li[j+1] = tem print(li) li = [3,2,4,1,5,7,9,6,8] insert_sort(li) print(li,'最后结果')
插入排序的复杂度:O(n^2)