数据结构之堆:堆的排序,Python代码实现——13
生活随笔
收集整理的這篇文章主要介紹了
数据结构之堆:堆的排序,Python代码实现——13
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
堆的排序,使用Python代碼實現
上一節對堆進行了簡單的實現,但是實現的堆只是部分有序(父結點大于子結點,子結點之間無序)
接下來我們實現對堆的所有元素進行升序排序
排序過程
實現步驟:
主要操作方法
構造堆
簡單直觀方法是對傳入的無需數組從左到右遍歷,然后依次將元素放入到堆的1~length處(0索引已廢除,為了定位元素位置時更方便),然后對元素依次通過比較和上浮順序調整達到堆的特性之后就實現了堆,但是我們觀察堆的特性
- 堆的中間索引處就是葉子結點和非葉子結點的分割處
因此可以總結一個更簡單的方法,只需要對非葉子結點做下沉動作即可:
堆構造create_heap()時的排序過程
實現堆的上升排序方法
對構造好的堆, 我們只需要做類似于堆的刪除操作, 就可以實現堆上升排序方法。
7. 將堆頂元素和堆中最后一個元索交換位置;
8. 通過對堆頂元索下沉調整堆,把最大的元索放到堆頂(此時最后一個元素不參與堆的調整,因為最大的數據已經到了數組的最右邊)
9. 重復1-2步驟,直到堆中剩最后-個元素。
堆上升排序ascending_sort()的過程
Python代碼實現
# coding = utf-8 # -*- coding:utf-8 -*-# 小根堆class HeapSort:def __init__(self):self.heap = [None] # 下標0不使用,從1開始(方便確定元素位置)self.length = 0def Swap(self, i, j):self.heap[i], self.heap[j] = self.heap[j], self.heap[i]def BuildHeap(self, target_arr):"""將傳入的一維數組轉變成堆"""self.heap.extend(target_arr)self.length += len(target_arr)for i in range(int((self.length-1)/2), 0, -1):self.Sink(i, self.length)def Sink(self, index, _range):"""_range是堆中最大的index,這一步實現找到左孩子和右孩子中較大者的下標"""while 2*index <= _range:# 2*index是左孩子的下標,2*index+1是右孩子的下標(若存在)max_elem_index = 2*index if 2*index+1 > _range else\(2*index + 1 if self.heap[2*index] < self.heap[2*index + 1] else 2*index)if self.heap[index] > self.heap[max_elem_index]: # 如果根結點比左孩子和右孩子都大則無需下沉,往下一個結點循環breakself.Swap(index, max_elem_index)index = max_elem_index # 若根結點(比max_index對應值還小則)下沉,還要繼續比較再下一層看是否還要執行下沉def Ascending_sort(self, target_arr):"""建立小根堆,使用升序排序"""# 先建立小根堆self.BuildHeap(target_arr)N = self.lengthwhile N > 1:self.Swap(1, N)N -= 1self.Sink(1, N)if __name__ == "__main__":HS = HeapSort()# arr = ['S', 'O', 'R', 'T', 'E', 'X', 'A', 'M', 'P', 'L', 'E']arr = [122, 1, 12, 111, -5, 7, 4, 3, 56, 34, 13, 14]# arr = [7, 2, 4, 4, 3, -1, 4, 2, 8, 1]# arr = [122]HS.Ascending_sort(arr)print(HS.heap)輸出結果
[None, -5, 1, 3, 4, 7, 12, 13, 14, 34, 56, 111, 122]總結
以上是生活随笔為你收集整理的数据结构之堆:堆的排序,Python代码实现——13的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智慧交通day02-车流量检测实现12:
- 下一篇: python控制步进电机驱动器_树莓派操