数据结构和算法
https://visualgo.net/zh
算法:
————————————————————————————————————————————————————————————————
查找算法:
顺序查找:
查找方式:find, rfind, index, rindex
while
def sequential_search(item, list):
i = 0
while i < len(list):
if item == list[i]:
return i
i += 1
else:
return -1
————————————————————————————————————
for
def sequential_search(item, list):
# enumerate() 得到的是N个元组,包含索引和单个元素组成的元组
for t in enumerate(list):
if item == t[1]:
return t[0]
else:
return -1
————————————————————————————————————
def sequential_Search(item,list):
i = 0
while i < len(list):
if item == list[i]:
return i
i += 1
raise ValueError('没有目标元素')
————————————————————————————————————————————————————————————————
二分查找:
递归实现二分查找
def binarch_sarch(start, stop, item, list):
mid = (start + stop) // 2
if start > stop:
return -1
else:
if list[mid] == item:
return mid
elif list[mid] > item:
return binarch_sarch(start, mid - 1, item, list1)
else:
return binarch_sarch(mid + 1, stop, item, list1)
————————————————————————————————————
循环实现二分查找
def binarch_sarch(item, list1):
start = 0
stop = len(list1) - 1
while start <= stop:
# 去中间元素
mid = (start + stop) // 2
if item == list1[mid]:
return mid
elif item > list1[mid]:
start = mid + 1
else:
stop = mid -1
return -1
————————————————————————————————————————————————————————————————
排序算法:
冒泡排序
list1 = [10, 20, 13, 80, 53, 0, -7]
# 拿其中一个数和其他数相比,所以是len(list1) - 1。控制两两比较
for i in range(len(list1) - 1):
if list1[i] > list1[i + 1]:
list1[i], list[i + 1] = list1[i + 1], list1[i]
print(list1)
# 得到的是最大值排在列表最后
print("——————————————————————")
我们在上一个循环之外再套一个循环
for i in range(len(list1) -1):
for i in range(len(list1) - 1):
if list1[i] > list1[i + 1]:
list1[i], list1[i + 1] = list1[i + 1], list1[i]
print(list1)
# 得到的是一个按从小到大排序的一个顺序列表
print("——————————————————————")
最后我们最好将它封装起来,方便调用
def bubble_sort(list):
for i in range(len(list1) -1):
for i in range(len(list1) - 1):
if list1[i] > list1[i + 1]:
list1[i], list1[i + 1] = list1[i + 1], list1[i]
print(list1)
选择排序:
def sel_sort(list1):
# 把较小的数值都放在前面了,最后面自然就是最大的。所以只需要比较len(list) - 1 次
for i in range(len(list) - 1):
# 每一次循环都把最小值拿到前面去了, 所以我们比较的最小值就变成list[i]
min = i
# 每一次都要和从自身索引的下一位开始比较,一直到最后一位。所以len(list)不用-1
for j in range(i + 1, len(list)):
if list[j] < list[min]:
min = j
# 每一次只取最小值放在前面,所以剩余所有元素比较完之后,只交换一次就够了。
list[i], list[min] = list[min], list[i]
print("————————")
print(list)