Python 資料結構與演算法 查詢與排序

2021-09-21 07:12:55 字數 3613 閱讀 1971

查詢和排序是最基本的演算法,在很多指令碼中都會用到查詢和排序。儘管 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 ...