您好,登錄后才能下訂單哦!
小編給大家分享一下python如何實現堆排序,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
堆排序
堆是一種完全二叉樹(是除了最后一層,其它每一層都被完全填充,保持所有節點都向左對齊),首先需要知道概念:最大堆問題,最大堆就是根節點比子節點值都大,并且所有根節點都滿足,那么稱它為最大堆。反之最小堆。
當已有最大堆,如下圖,首先將7提出,然后將堆中最后一個元素放到頂點上,此時這個堆不滿足最大堆了,那么我們要給它構建成最大堆,需要找到此時堆中對打元素然后交換,此時最大值為6,符合最大堆后,我們將6提取出來,然后將堆中最后一個元素放到堆的頂部...以此類推。最后提取的數值7,6,5,4,3,2,1
那么在維護一個最大堆過程中,最多進行交換次數決定了此算法復雜度,但交換次數與樹的高度有關:
h=log2(n+1)h=log2(n+1)
最大堆生成:根據最大堆特性(任意一個根節點都大于葉子節點)不滿足就調換。
代碼實現:
from collections import deque def swap_param(L, i, j): # 堆頂與最后元素交換 L[i], L[j] = L[j], L[i] return L def heap_adjust(L, start, end): #構造成大根堆 temp = L[start] i = start j = 2 * i while j <= end: # 判斷左右子節點,取兩個子節點最大索引 if (j < end) and (L[j] < L[j + 1]): j += 1 # 判斷根節點與子節點比較,如果子節點大于根節點,子節點賦值給根節點 if temp < L[j]: L[i] = L[j] i = j j = 2 * i else: break # 再把 原來根節點值賦值給子節點上 L[i] = temp def heap_sort(L): L_length = len(L) - 1 first_sort_count = L_length // 2 for i in range(first_sort_count): heap_adjust(L, first_sort_count - i, L_length) for i in range(L_length - 1): L = swap_param(L, 1, L_length - i) heap_adjust(L, 1, L_length - i - 1) return [L[i] for i in range(1, len(L))] def main(): L = deque([50, 16, 30, 10, 60, 90, 2, 80, 70]) L.appendleft(0) print(heap_sort(L)) main()
基礎知識點擴展:
堆排序
堆
堆棧是計算機的兩種最基本的數據結構。堆的特點就是FIFO(first in first out)先進先出,這里的話我覺得可以理解成樹的結構。堆在接收數據的時候先接收的數據會被先彈出。
堆排序節點訪問和操作定義
堆節點的訪問
在這里我們借用wiki的定義來說明:
通常堆是通過一維數組來實現的。在陣列起始位置為0的情況中
父節點i的左子節點在位置(2*i+1);
父節點i的右子節點在位置(2*i+2);
子節點i的父節點在位置floor((i-1)/2);
以上是“python如何實現堆排序”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。