前言
本人是一個長期的數據分析愛好者,最近半年的時間的在網上學習了很多關於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))
輸出結果