python常用算法了解
这里从个人角度,总结下python常用算法,不罗嗦,直接看代码(文字解释及推到过程网上有很多,大家可以通过度娘了解)
以下排名仅从写代码人自己习惯的顺序!
NO.1 二分查找
import time
# 时间装饰器
def cal_time(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
# print("%s running time: %s secs." % (func.__name__, start_time - end_time))
print("%s 函数执行时间是: %s 秒" % (func.__name__, start_time - end_time))
return result
return wrapper
@cal_time
def bin_search(data_list, val):
# 开始位置:第0个位置
low = 0
# 结束位置:最后一个位置
high = len(data_list) - 1
# 循环判断
while low <= high:
# 获取中间位置,这里需要整除//
mid = (low + high) // 2
# 判断中间索引对应的数字是不是查找的数字
if data_list[mid] == val:
#print(data_list[mid])
return mid
# 如果中间索引对应的数字在查找数字的左边,则 low = mid + 1
elif data_list[mid] < val:
low = mid + 1
# 如果中间索引对应的数字在查找数字的右边,则 high = mid - 1
elif data_list[mid] > val:
high = mid - 1
return
if __name__ == '__main__':
data_list = list(range(1,10000))
ret = bin_search(data_list, 6666)
print(ret)
NO.2 冒泡
import random
def buble_sort1(data_list):
# i 是已经执行的趟数 i=n-1 ,n是列表中数字总个数=len(data_list)
for i in range(len(data_list) - 1):
# j是等待执行的趟数
for j in range(len(data_list) - 1 - i):
if data_list[j] > data_list[j + 1]:
data_list[j], data_list[j + 1] = data_list[j + 1], data_list[j]
#优化版本
#如果排了一半,后面数据不需要排序的情况
def buble_sort2(data_list):
# i 是已经执行的趟数 i=n-1 ,n是列表中数字总个数=len(data_list)
for i in range(len(data_list) - 1):
exchange = False
# j是等待执行的趟数
for j in range(len(data_list) - 1 - i):
if data_list[j] > data_list[j + 1]:
data_list[j], data_list[j + 1] = data_list[j + 1], data_list[j]
#如果进行交换,则修改变量
exchange = True
#如果没发生交换
if not exchange: #exchange = False
break
if __name__ == '__main__':
data_list = list(range(1001))
# 打乱数字顺序
random.shuffle(data_list)
# print(data_list)
buble_sort2(data_list)
print(data_list)
NO.3 快排
import random
def quick_sort_x(data, left, right):
#判断left right,如果相等,就结束函数
if left < right:
#mid是tmp的索引位置
mid = partition(data, left, right)
#左边递归
quick_sort_x(data, left, mid - 1)
#右边递归
quick_sort_x(data, mid + 1, right)
def partition(data, left, right):
#把data[left]赋值给了tmp,所以现在left的位置是空的
tmp = data[left]
# 判断left right,如果相等,就结束函数
while left < right:
#先从右边开始找
#右边寻找的是比tmp小的数,所以,如果找到比tmp大的数,进行循环
while left < right and data[right] >= tmp:
right -= 1
# 把右边找到的数赋值给左边,右边出现了空位置
# 现在指针现在到了左边
data[left] = data[right]
# 左边寻找的是比tmp大的数,所以,如果找到比tmp小的数,进行循环
while left < right and data[left] <= tmp:
left += 1
# 把左边找到的数赋值给右边,左边出现了空位置
# 现在指针现在到了右边
data[right] = data[left]
#把tmp赋值给左边空出的位置
data[left] = tmp
# 返回tmp的下角标(索引)
return left
if __name__ == '__main__':
data = list(range(1000))
random.shuffle(data)
print('排序前:',data)
quick_sort_x(data,0,len(data)-1)
print('排序后:',data)
NO.4 插入排序
import random
def insert_sort(data_list):
for i in range(1, len(data_list)):
temp = data_list[i]
j = i - 1
while j >= 0 and data_list[j] > temp:
data_list[j + 1] = data_list[j]
# 少了一个数
j = j - 1
data_list[j + 1] = temp
if __name__ == '__main__':
data_list = list(range(1001))
# 打乱数字顺序
random.shuffle(data_list)
# print(data_list)
insert_sort(data_list)
print(data_list)
NO.5 选择排序
import random
def select_sort(data_list):
for i in range(len(data_list) - 1):
# 假设第i个索引对应的值最小
min_index = i
# 第i个索引对应的值 和 从第i+1个索引开始的数进行循环比较
for j in range(i + 1, len(data_list)):
if data_list[min_index] > data_list[j]:
min_index = j
# 注意:这时 data_list[min_index] = data_list[j]
data_list[i], data_list[min_index] = data_list[min_index], data_list[i]
if __name__ == '__main__':
data_list = list(range(1001))
# 打乱数字顺序
random.shuffle(data_list)
select_sort(data_list)
print(data_list)
NO.6 堆排序
import random
def sift(data,low,high):
i = low
j = 2 * i + 1
tmp = data[i]
while j <= high:
#if j < high and data[j] < data[j + 1]:
if j < high and data[j] > data[j + 1]:
j = j + 1
#if tmp < data[j]:
if tmp > data[j]:
data[i] = data[j]
i = j
j = 2 * i + 1
else:
break
data[i] = tmp
def heap_sort(data):
n = len(data) # 把堆的长度存一下
# 建堆:
# 从最后一个有孩子的父亲开始,直到第一个领导【(n // 2 - 1,-1)--->范围,最后一个 -1是步长】
# 实验证明:最后一个有孩子的父亲的位置是n // 2 - 1
for i in range(n // 2 - 1, -1,-1):
# 每次调整这个领导('i')所在的堆【每个小堆做调整】,调整到堆的最后,所以 high = n-1
# 堆就建好了
sift(data, i, n - 1)
# 挨个出数:
for i in range(n - 1, -1):
# i 是堆的最后一个元素
# 领导退休,平民上位
data[0], data[i] = data[i], data[0]
# 调整出新领导
sift(data, 0, i - 1)
if __name__ == '__main__':
data = list(range(1000))
random.shuffle(data)
print('排序前:',data)
heap_sort(data)
print('排序后:',data)