Python__数据结构与算法——查找与排序
?
查找和排序是最基本的算法,在很多腳本中都會用到查找和排序。盡管 Python 提供的用于查找和排序的函數能夠滿足絕大多數需求,但還是有必要了解最基本的查找和排序算法,以便在有特殊需求的情況下,可以自己編寫查找、排序腳本。
一、查找
基本的查找方法有順序查找、二分查找和分塊查找等。其中,順序查找是最簡單的查找方法,就是按照數據排列的順序依次查找,直到找到所查找的數據為止(可查看數據表都未找到數據)。
二分查找是首先對要進行查找的數據進行排序,有按大小順序排好的 9 個數字,如圖-1所示。如果要進行查找數字 5,則首先與中間值 10 進行比較,5 小于 10,于是對序列的前半部分 1~9 進行查找。此時,中間值為 5,恰好為要找的數字,查找結束。
分塊查找,是介于順序查找和二分查找之間的一種查找方法。使用分塊查找時,首先對查找表建立一個索引表,然后再進行分塊查找。建立索引表時,首先對查找表進行分塊,要求 "分塊有序",即塊內關鍵字不一定有序,但分塊之間有大小順序。索引表是抽取各塊中的最大關鍵字及其起始位置構成的,如圖-2 所示。
分塊查找分兩步進行,首先查找索引表,因為索引表是有序的,查找索引表時可以使用二分查找法進行。查找完索引表以后,就確定了要查找的數據所在的分塊,然后在該分塊中再進行順序查找。
下面所示的 pyBinarySearch.py 腳本是對一個有序列表使用二分查找。
# -*- coding:UTF-8 -*- # file: pyBinarySearch.pydef BinarySearch(l, key): # 二分查找low = 0high = len(l) - 1i = 0while low <= high:i = i + 1mid = (high + low) // 2if l[mid] < key:low = mid + 1elif l[mid] > key:high = mid - 1else:print('use %d time(s)' % i)return midreturn -1if __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",則二叉樹的建立過程如下。
- Step1:首先將第一個數據 3 放入根節點。
- Step2:將數據 5 與根節點中的數據 3 比較,由于 5 大于 3,因此應將 5 放入 3 的右子樹中。
- Step3:將數據 7 與根節點中的數據 3 比較,由于 7 大于 3,因此應將 5 放入 3 的右子樹中,由于 3 已經有右兒子 5,所以將 7 與 5 進行比較,因為 7 大于 5,所以應將 7 放入 5 的右子樹中。
- Step4:將數據 20 與根節點中的數據 3 比較,由于 20 大于 3,因此應將 20 放入 3 的右子樹中,重復比較,最終將 20 放入 7 的右子樹中。
- Step5:將數據 43 與樹中的節點值進行比較,最終將其放入 20 的右子樹中。
- Step6:將數據 2 與根節點 3 進行比較,由于 2 小于 3,因此應將 2 放入 3 的左子樹。
- Step7:同樣的對數據 15 和 30 進行處理,最終形成如圖-3 所示的樹。
當樹創建好后,對數進行中序遍歷,得到的遍歷結果就是對數據從小到大排序。如果要從大到小進行排序則可以先從右子樹開始進行中序遍歷。
下面所示的 pySort.py 腳本是采用二叉樹排序的方式對數據進行排序。
# -*- coding:UTF-8 -*- # file: pySort.pyclass BTree: # 二叉樹節點def __init__(self, value): # 初始化函數self.left = None # 左兒子self.data = value # 節點值self.right = None # 右兒子def insertLeft(self, value): # 向左子樹插入節點self.left = BTree(value)return self.leftdef insertRight(self, value): # 向右子樹插入節點self.right = BTree(value)return self.rightdef 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 = Rootfor i in range(1,len(l)):insert(Root, l[i])print('**************************')print(' 從小到大')print('**************************')inorder(Root)print('**************************')print(' 從大到小')print('**************************')rinorder(Root)運行 pySort.py 腳本后,輸出如下所示的排序結果:
總結
以上是生活随笔為你收集整理的Python__数据结构与算法——查找与排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python__数据结构与算法——图
- 下一篇: Python__面向对象思想