Python實現(xiàn)的堆排序算法示例
本文實例講述了Python實現(xiàn)的堆排序算法。分享給大家供大家參考,具體如下:
堆排序的思想: 堆是一種數(shù)據(jù)結(jié)構(gòu),可以將堆看作一棵完全二叉樹,這棵二叉樹滿足,任何一個非葉節(jié)點的值都不大于(或不小于)其左右孩子節(jié)點的值。 將一個無序序列調(diào)整為一個堆,就可以找出這個序列的最大值(或最小值),然后將找出的這個值交換到序列的最后一個,這樣有序序列就元素就增加一個,無序序列元素就減少一個,對新的無序序列重復(fù)這樣的操作,就實現(xiàn)了排序。
堆排序的執(zhí)行過程:
1.從無序序列所確定的完全二叉樹的第一個非葉子節(jié)點開始,從右至左,從下至上,對每個節(jié)點進行調(diào)整,最終將得到一個大頂堆。
對節(jié)點的調(diào)整方法:將當(dāng)前節(jié)點(假設(shè)為a)的值與其孩子節(jié)點進行比較,如果存在大于a的值的孩子節(jié)點,則從中選出最大的一個與a交換。當(dāng)a來到下一層的時候重復(fù)上述過程,直到a的孩子節(jié)點的值都小于a為止
2.將當(dāng)前無序序列中的第一個元素(反映在數(shù)中是根節(jié)點b),與無序序列中的最后一個元素交換(假設(shè)為c),b進入有序序列,到達最終位置。無序序列元素減少1個,有序序列元素增加1個,此時只有節(jié)點c可能不滿足堆的定義,對其進行調(diào)整。
3.重復(fù)2 的過程,直到無序序列的元素剩下一個時排序結(jié)束。
# -*- coding:utf-8 -*- # 堆排序適用于記錄數(shù)很多的情況 from collections import deque # 這里需要說明元素的存儲必須要從1開始 # 涉及到左右節(jié)點的定位,和堆排序開始調(diào)整節(jié)點的定位 # 在下標0處插入0,它不參與排序 L = deque([49,38,65,97,76,13,27,49]) L.appendleft(0) #L = [0,49,38,65,97,76,13,27,49] def element_exchange(numbers,low,high): temp = numbers[low] # j 是low的左孩子節(jié)點(cheer!) i = low j = 2*i while j<=high: # 如果右節(jié)點較大,則把j指向右節(jié)點 if j<high and numbers[j]<numbers[j+1]: j = j+1 if temp<numbers[j]: # 將numbers[j]調(diào)整到雙親節(jié)點的位置上 numbers[i] = numbers[j] i = j j = 2*i else: break # 被調(diào)整節(jié)點放入最終位置 numbers[i] = temp def top_heap_sort(numbers): length = len(numbers)-1 # 指定第一個進行調(diào)整的元素的下標 # 它即該無序序列完全二叉樹的第一個非葉子節(jié)點 # 它之前的元素均要進行調(diào)整 # cheer up! first_exchange_element = length/2 #建立初始堆 print first_exchange_element for x in range(first_exchange_element): element_exchange(numbers,first_exchange_element-x,length) # 將根節(jié)點放到最終位置,剩余無序序列繼續(xù)堆排序 # length-1 次循環(huán)完成堆排序 for y in range(length-1): temp = numbers[1] numbers[1] = numbers[length-y] numbers[length-y] = temp element_exchange(numbers,1,length-y-1) if __name__=='__main__': top_heap_sort(L) for x in range(1,len(L)): print L[x],
運行結(jié)果:
PS:這里再為大家推薦一款關(guān)于排序的演示工具供大家參考:
在線動畫演示插入/選擇/冒泡/歸并/希爾/快速排序算法過程工具:
http://tools.jb51.net/aideddesign/paixu_ys
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python列表(list)操作技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計有所幫助。
相關(guān)文章
Python用內(nèi)置模塊來構(gòu)建REST服務(wù)與RPC服務(wù)實戰(zhàn)
這篇文章主要介紹了Python用內(nèi)置模塊來構(gòu)建REST服務(wù)與RPC服務(wù)實戰(zhàn),python在網(wǎng)絡(luò)方面封裝一些內(nèi)置模塊,可以用很簡潔的代碼實現(xiàn)端到端的通信,比如HTTP、RPC服務(wù),下文實戰(zhàn)詳情,需要的朋友可以參考一下2022-09-09MacOS(M1芯片 arm架構(gòu))下安裝PyTorch的詳細過程
這篇文章主要介紹了MacOS(M1芯片 arm架構(gòu))下安裝PyTorch的詳細過程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02Python爬蟲之Selenium多窗口切換的實現(xiàn)
這篇文章主要介紹了Python爬蟲之Selenium多窗口切換的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12利用Python+Selenium破解春秋航空網(wǎng)滑塊驗證碼的實戰(zhàn)過程
本文給大家介紹使用Python+Selenium破解春秋航空網(wǎng)滑塊驗證碼的實戰(zhàn)過程,本文通過圖文實例相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-08-08Python類方法__init__和__del__構(gòu)造、析構(gòu)過程分析
這篇文章主要介紹了Python類方法__init__和__del__構(gòu)造、析構(gòu)過程分析,本文分析了什么時候構(gòu)造、什么時候析構(gòu)、成員變量如何處理、Python中的共享成員函數(shù)如何訪問等問題,需要的朋友可以參考下2015-03-03Python數(shù)據(jù)分析之繪制ppi-cpi剪刀差圖形
這篇文章主要介紹了Python數(shù)據(jù)分析之繪制ppi-cpi剪刀差圖形,ppi-cp剪刀差是通過這個指標可以了解當(dāng)前的經(jīng)濟運行狀況,下文更多詳細內(nèi)容介紹需要的小伙伴可以參考一下2022-05-05