先放一个网址,可以看到冒泡,选择,插入排序的过程 冒泡-选择-插入排序
二分法(基于有序列表)
前言:二分法是一个优化算法,在一个基于有序列表中,列表从1到10000,如果要找一个8899的数字,不用二分法的话,就是循环从一到10000,直到找到8899.但是,有没有想过,前5000个都比8899小,所以能不能直接第一次就判断哪些值小于我需要的值呢?
二分法就是基于这样的场景出现的,一次砍掉一半数字,相对于亿万数据的,性能的优化不是一点半点。
它的时间复杂度是O(logn)
代码实现
def binary_search(li, n):
low = 0 # 定义开始循环的索引
high = len(li)-1 # 定义最后一个索引
while low <= high:
mid = (low + high) // 2 # 算出开始索引和最后索引的相对中间位置
if li[mid] == n: # 如果这个索引代表的值就是查找的值,直接返回
return mid
elif li[mid] < n: # 判断中间的这个值是否小于n(查找的值),如果小于n,说明这个值在所有为mid的右边,这时需要左边的low向前进一
low = mid + 1
else: # 反之,右边的索引往mid左边走,就是mid-1
high = mid -1
return -1
递归版本
def bin_search_rec(data_set, value, low, high):
if low <= high:
mid = (low + high) // 2
if data_set[mid] == value:
return mid
elif data_set[mid] > value:
return bin_search_rec(data_set, value, low, mid-1)
else:
return bin_search_rec(data_set, value, mid+1, high)
else:
return
冒泡排序
冒泡排序思想
让数组当中相邻的两个数进行比较,数组当中比较小的数值向下沉,数值比较大的向上浮!外层for循环控制循环次数,内层for循环控制相邻的两个元素进行比较。
给定一个N个元素的数组,冒泡法排序将:
- 如果元素大小关系不正确,交换这两个数(在本例中为a> b),
- 比较一对相邻元素(a,b),
- 重复步骤1和2,直到我们到达数组的末尾(最后一对是第(N-2)和(N-1)项,因为我们的数组从零开始)
- 到目前为止,最大的元素将在最后的位置。 然后我们将N减少1,并重复步骤1,直到N = 1。
代码实现
def bubble_sort(li):
for i in range(len(li)):
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j],li[j+1] = li[j+1], li[j]
优化
def bubble_sort(li):
for i in range(len(li)):
swapped = 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]
swapped = True
if not swapped:
return