優(yōu)先隊(duì)列(堆排序)
優(yōu)先隊(duì)列:最重要的操作就是刪除最大元素和插入元素
堆排序:堆排序?qū)τ谟涗涊^少的文件效果一般,對于文件較多還是比較有效的,最差的時(shí)間復(fù)雜度為nlog(n),屬于不穩(wěn)定排序
堆排序可以被認(rèn)為是一種改進(jìn)的選擇排序:就像選擇算法一樣,它將輸入分成已排序的和還未排序的區(qū)域,它通過提取未排序的區(qū)域內(nèi)最大的元素并將其移動(dòng)到已排序的區(qū)域來迭代縮小未排序的區(qū)域。堆排序相對選擇排序改進(jìn)的部分包括使用堆數(shù)據(jù)結(jié)構(gòu)而不是線性時(shí)間的搜索來找到最大值。摘于知乎:堆排序
步驟:
輸入:一系列的無序元素(比如說,數(shù)字)組成的輸入數(shù)組A
經(jīng)過:堆排序的過程可以具體分為三步,創(chuàng)建堆,調(diào)整堆,堆排序。
創(chuàng)建堆,以數(shù)組的形式將堆中所有的數(shù)據(jù)重新排序,使其成為最大堆/最小堆。
調(diào)整堆,調(diào)整過程需要保證堆序性質(zhì):在一個(gè)二叉堆中任意父節(jié)點(diǎn)大于其子節(jié)點(diǎn)。
堆排序,取出位于堆頂?shù)牡谝粋€(gè)數(shù)據(jù)(最大堆則為最大數(shù),最小堆則為最小數(shù)),放入輸出數(shù)組B 中,再將剩下的對作調(diào)整堆的迭代/重復(fù)運(yùn)算直至輸入數(shù)組 A中只剩下最后一個(gè)元素。
輸出:輸出數(shù)組B,里面包含的元素都是A 中的但是已經(jīng)按照要求排好了順序
# python中heapq堆使用
importheapq
list = [1,2,3,5,1,5,8,9,6]
heapq.heapify(list)
代碼參考:
公眾號(hào):算法手記