前言
本人是一个长期的数据分析爱好者,最近半年的时间的在网上学习了很多关于python、数据分析、数据挖掘以及项目管理相关的课程和知识,但是在学习的过程中,过于追求课程数量的增长,长时间关注于学习了多少多少门课程。事实上,学完一门课之后真正掌握的知识并不多,主要的原因是自己没有认真学习和理解温故而知新的这句话的真正含义。因此,从现在开始,我在学习《数据结构与算法——基于python》的课程内容之后,抽出固定的时间对每天学习的内容进行总结和分享,一方面有助于个人更好的掌握课程的内容,另一方面能和大家一起分享个人的学习历程和相应的学习知识。
第四节 搜索与排序
基础知识
内容概述:顺序查找、二分搜索;冒泡排序、选择排序、插入排序、计数排序、归并排序、快速排序、堆排序/二叉树排序、python lib、 应用。
1 顺序查找:
对于乱序的集合,查找其中的元素,只能用顺序查找; O(n/2)
程序
def search(num_list, val):
# If empty
if num_list == None:
return -1
for i in range(0, len(num_list)):
if (num_list[i] == val):
return i
return -1
num_list = [1,2,3,5,7,8,9]
print(search(num_list, 7))
print(search(num_list, 4))
输出结果
2 折半查找:
对于有序的集合,查找其中的元素,可用折半查找;O(log2n)
程序
递归方式
# 递归方式
def bi_search_re(num_list, val):
def bi_search(l, h): # 定义一个low和high
# Not found
if l > h: # 相交
return -1
# Check mid
mid = (l + h) // 2
if (num_list[mid] == val):
return mid;
elif (num_list[mid] < val):
return bi_search(mid + 1, h)
else:
return bi_search(l, mid - 1)
# return bi_search(0, len(num_list)) 我自己取消这一行程序的
num_list = [1,2,3,5,7,8,9]
print(search(num_list, 7))
print(search(num_list, 4))
输出结果
非递归方式
def bi_search_iter(alist, item):
left, right = 0, len(alist) - 1
while left <= right:
mid = left +(right - left)//2 # (left + right) // 2
if alist[mid] < item:
left = mid + 1
elif alist[mid] > item:
right = mid - 1
else: # alist[mid] = item
return mid
return -1
num_list = [1,2,3,5,7,8,9]
print(bi_search_iter(num_list, 9))
print(bi_search_iter(num_list, 4))
输出结果