查詢和排序是最基本的演算法,在很多指令碼中都會用到查詢和排序。儘管 python 提供的用於查詢和排序的函式能夠滿足絕大多數需求,但還是有必要了解最基本的查詢和排序演算法,以便在有特殊需求的情況下,可以自己編寫查詢、排序指令碼。基本的查詢方法有順序查詢、二分查詢和分塊查詢等。其中,順序查詢是最簡單的查詢方法,就是按照資料排列的順序依次查詢,直到找到所查詢的資料為止(可檢視資料表都未找到資料)。
二分查詢是首先對要進行查詢的資料進行排序,有按大小順序排好的 9 個數字,如圖-1所示。如果要進行查詢數字 5,則首先與中間值 10 進行比較,5 小於 10,於是對序列的前半部分 1~9 進行查詢。此時,中間值為 5,恰好為要找的數字,查詢結束。
分塊查詢,是介於順序查詢和二分查詢之間的一種查詢方法。使用分塊查詢時,首先對查詢表建立乙個索引表,然後再進行分塊查詢。建立索引表時,首先對查詢表進行分塊,要求 "分塊有序",即塊內關鍵字不一定有序,但分塊之間有大小順序。索引表是抽取各塊中的最大關鍵字及其起始位置構成的,如圖-2 所示。
分塊查詢分兩步進行,首先查詢索引表,因為索引表是有序的,查詢索引表時可以使用二分查詢法進行。查詢完索引表以後,就確定了要查詢的資料所在的分塊,然後在該分塊中再進行順序查詢。
下面所示的 pybinarysearch.py 指令碼是對乙個有序列表使用二分查詢。
# -*- coding:utf-8 -*-
# file: pybinarysearch.py
def binarysearch(l, key): # 二分查詢
low = 0
high = len(l) - 1
i = 0
while low <= high:
i = i + 1
mid = (high + low) // 2
if l[mid] < key:
low = mid + 1
elif l[mid] > key:
high = mid - 1
else:
print('use %d time(s)' % i)
return mid
return -1
if __name__ == '__main__':
l = [1, 5, 6, 9, 10, 51, 62, 65, 70] # 構造列表
print(binarysearch(l, 5)) # 在列表中查詢
print(binarysearch(l, 10))
print(binarysearch(l, 65))
print(binarysearch(l, 70))
執行指令碼輸出結果如下:
對於查詢來說,排序要複雜得多,排序的方法也較多,常用的排序方法有冒泡法排序、希爾排序、二叉樹排序和快速排序等,其中,二叉樹排序是比較有意思的一種排序方法,而且也便於操作。二叉樹排序的過程主要是二叉樹的建立和遍歷的過程。例如,有一組資料 "3,5,7,20,43,2,15,30",則二叉樹的建立過程如下。
當樹建立好後,對數進行中序遍歷,得到的遍歷結果就是對資料從小到大排序。如果要從大到小進行排序則可以先從右子樹開始進行中序遍歷。
下面所示的 pysort.py 指令碼是採用二叉樹排序的方式對資料進行排序。
# -*- coding:utf-8 -*-
# file: pysort.py
class btree: # 二叉樹節點
def __init__(self, value): # 初始化函式
self.left = none # 左兒子
self.data = value # 節點值
self.right = none # 右兒子
def insertleft(self, value): # 向左子樹插入節點
self.left = btree(value)
return self.left
def insertright(self, value): # 向右子樹插入節點
self.right = btree(value)
return self.right
def show(self): # 輸出節點資料
print(self.data)
def inorder(node): # 中序遍歷
if node.data:
if node.left:
inorder(node.left)
node.show()
if node.right:
inorder(node.right)
def rinorder(node): # 中序遍歷
if node.data:
if node.right:
rinorder(node.right)
node.show()
if node.left:
rinorder(node.left)
def insert(node, value): # 中序遍歷,先遍歷右子樹
if value > node.data:
if node.right:
insert(node.right, value)
else:
node.insertright(value)
else:
if node.left:
insert(node.left, value)
else:
node.insertleft(value)
if __name__ == '__main__':
l = [3, 5, 7, 20, 43, 2, 15, 30]
root = btree(l[0]) # 根節點
node = root
for i in range(1,len(l)):
insert(root, l[i])
print('**************************')
print(' 從小到大')
print('**************************')
inorder(root)
print('**************************')
print(' 從大到小')
print('**************************')
rinorder(root)
執行 pysort.py 指令碼後,輸出如下所示的排序結果:
python演算法與資料結構 07查詢
1.遞迴版本 def binarysearch1 alist,item 二分查詢前提 有序陣列 二分查詢遞迴版本 時間複雜度 o logn n len alist if0 n return false mid n 2if alist mid item return true elif alist m...
資料結構與演算法(查詢)
1 查詢表 用於查詢的資料集合,由同一型別的資料元素組成,經常進行的操作 2 靜態查詢表 無需動態修改查詢表的操作,都是靜態查詢表。適合的查詢方法有順序查詢 折半查詢 雜湊查詢。3 動態查詢表 需要動態插入或刪除的操作。適合的查詢方法有二叉排序樹查詢 雜湊查詢。4 關鍵字 資料元素中唯一表示該元素的...
資料結構與演算法 查詢演算法
1.線性查詢,從頭到尾去遍歷,找到符合的則返回 2.二分法查詢 前提 目標陣列有序 package math public class dichotomy int k new dichotomy show arr,8 system.out.println k public int show int ...