亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁(yè) > 知識(shí)庫(kù) > Python實(shí)現(xiàn)堆排序案例詳解

Python實(shí)現(xiàn)堆排序案例詳解

熱門標(biāo)簽:徐州天音防封電銷卡 佛山防封外呼系統(tǒng)收費(fèi) 不錯(cuò)的400電話辦理 南昌辦理400電話怎么安裝 湛江電銷防封卡 電話機(jī)器人適用業(yè)務(wù) 鄭州智能外呼系統(tǒng)運(yùn)營(yíng)商 獲客智能電銷機(jī)器人 哈爾濱外呼系統(tǒng)代理商

Python實(shí)現(xiàn)堆排序

一、堆排序簡(jiǎn)介

堆排序(Heap Sort)是利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。

堆的結(jié)構(gòu)是一棵完全二叉樹的結(jié)構(gòu),并且滿足堆積的性質(zhì):每個(gè)節(jié)點(diǎn)(葉節(jié)點(diǎn)除外)的值都大于等于(或都小于等于)它的子節(jié)點(diǎn)。

關(guān)于二叉樹和完全二叉樹的介紹可以參考:https://www.jb51.net/article/222487.htm

堆排序先按從上到下、從左到右的順序?qū)⒋判蛄斜碇械脑貥?gòu)造成一棵完全二叉樹,然后對(duì)完全二叉樹進(jìn)行調(diào)整,使其滿足堆積的性質(zhì):每個(gè)節(jié)點(diǎn)(葉節(jié)點(diǎn)除外)的值都大于等于(或都小于等于)它的子節(jié)點(diǎn)。構(gòu)建出堆后,將堆頂與堆尾進(jìn)行交換,然后將堆尾從堆中取出來,取出來的數(shù)據(jù)就是最大(或最小)的數(shù)據(jù)。重復(fù)構(gòu)建堆并將堆頂和堆尾進(jìn)行交換,取出堆尾的數(shù)據(jù),直到堆中的數(shù)據(jù)全部被取出,列表排序完成。

堆結(jié)構(gòu)分為大頂堆和小頂堆:

1. 大頂堆:每個(gè)節(jié)點(diǎn)(葉節(jié)點(diǎn)除外)的值都大于等于其子節(jié)點(diǎn)的值,根節(jié)點(diǎn)的值是所有節(jié)點(diǎn)中最大的,所以叫大頂堆,在堆排序算法中用于升序排列。

2. 小頂堆:每個(gè)節(jié)點(diǎn)(葉節(jié)點(diǎn)除外)的值都小于等于其子節(jié)點(diǎn)的值,根節(jié)點(diǎn)的值是所有節(jié)點(diǎn)中最小的,所以叫小頂堆,在堆排序算法中用于降序排列。

二、堆排序原理

堆排序的原理如下:

1. 將待排序列表中的數(shù)據(jù)按從上到下、從左到右的順序構(gòu)造成一棵完全二叉樹。

2. 將完全二叉樹中每個(gè)節(jié)點(diǎn)(葉節(jié)點(diǎn)除外)的值與其子節(jié)點(diǎn)(子節(jié)點(diǎn)有一個(gè)或兩個(gè))中較大的值進(jìn)行比較,如果節(jié)點(diǎn)的值小于子節(jié)點(diǎn)的值,則交換他們的位置(大頂堆,小頂堆反之)。

3. 將節(jié)點(diǎn)與子節(jié)點(diǎn)進(jìn)行交換后,要繼續(xù)比較子節(jié)點(diǎn)與孫節(jié)點(diǎn)的值,直到不需要交換或子節(jié)點(diǎn)是葉節(jié)點(diǎn)時(shí)停止。比較完所有的非葉節(jié)點(diǎn)后,即可構(gòu)建出堆結(jié)構(gòu)。

4. 將數(shù)據(jù)構(gòu)造成堆結(jié)構(gòu)后,將堆頂與堆尾交換,然后將堆尾從堆中取出來,添加到已排序序列中,完成一輪堆排序,堆中的數(shù)據(jù)個(gè)數(shù)減1。

5. 重復(fù)步驟2,3,4,直到堆中的數(shù)據(jù)全部被取出,列表排序完成。

以列表 [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21] 進(jìn)行升序排列為例。列表的初始狀態(tài)如下圖。

要進(jìn)行升序排序,則構(gòu)造堆結(jié)構(gòu)時(shí),使用大頂堆。

1. 將待排序列表中的數(shù)據(jù)按從上到下、從左到右的順序構(gòu)造成一棵完全二叉樹。

2. 從完全二叉樹的最后一個(gè)非葉節(jié)點(diǎn)開始,將它的值與其子節(jié)點(diǎn)中較大的值進(jìn)行比較,如果值小于子節(jié)點(diǎn)則交換。24是最后一個(gè)非葉子節(jié)點(diǎn),它只有一個(gè)子節(jié)點(diǎn)21,24大于21,不需要交換。

3. 繼續(xù)將倒數(shù)第二個(gè)非葉節(jié)點(diǎn)的值與其子節(jié)點(diǎn)中較大的值進(jìn)行比較,如果值小于子節(jié)點(diǎn)則交換。節(jié)點(diǎn)30有兩個(gè)子節(jié)點(diǎn)5和36,較大的是36,30小于36,交換位置。

4. 重復(fù)對(duì)下一個(gè)節(jié)點(diǎn)進(jìn)行比較。7小于45,交換位置。

5. 繼續(xù)重復(fù),50大于27,不需要交換位置。如果不需要進(jìn)行交換,則不用再比較子節(jié)點(diǎn)與孫節(jié)點(diǎn)。

6. 繼續(xù)重復(fù),17小于45,交換位置。

7. 17和45交換位置之后,17交換到了子節(jié)點(diǎn)的位置,還需要繼續(xù)將其與孫節(jié)點(diǎn)進(jìn)行比較。17大于15,不需要交換。

8. 繼續(xù)對(duì)下一個(gè)節(jié)點(diǎn)進(jìn)行比較,10小于50,交換位置。

9. 10和50交換位置之后,10交換到了子節(jié)點(diǎn)的位置,還需要繼續(xù)將其與孫節(jié)點(diǎn)進(jìn)行比較。10小于于27,交換位置。

10. 此時(shí),一個(gè)大頂堆構(gòu)造完成,滿足了堆積的性質(zhì):每個(gè)節(jié)點(diǎn)(葉節(jié)點(diǎn)除外)的值都大于等于它的子節(jié)點(diǎn)。

11. 大頂堆構(gòu)建完成后,將堆頂與堆尾交換位置,然后將堆尾從堆中取出。將50和21交換位置,交換后21到了堆頂,50(最大的數(shù)據(jù))到了堆尾,然后將50從堆中取出。

12. 將50從堆中取出后,找到了待排序列表中的最大值,50添加到已排序序列中,第一輪堆排序完成,堆中的元素個(gè)數(shù)減1。

13. 取出最大數(shù)據(jù)后,重復(fù)將完全二叉樹構(gòu)建成大頂堆,交換堆頂和堆尾,取出堆尾。這樣每次都是取出當(dāng)前堆中最大的數(shù)據(jù),添加到已排序序列中,直到堆中的數(shù)據(jù)全部被取出。

14. 循環(huán)進(jìn)行 n 輪堆排序之后,列表排序完成。排序結(jié)果如下圖。

三、Python實(shí)現(xiàn)堆排序

# coding=utf-8
def heap_sort(array):
    first = len(array) // 2 - 1
    for start in range(first, -1, -1):
        # 從下到上,從右到左對(duì)每個(gè)非葉節(jié)點(diǎn)進(jìn)行調(diào)整,循環(huán)構(gòu)建成大頂堆
        big_heap(array, start, len(array) - 1)
    for end in range(len(array) - 1, 0, -1):
        # 交換堆頂和堆尾的數(shù)據(jù)
        array[0], array[end] = array[end], array[0]
        # 重新調(diào)整完全二叉樹,構(gòu)造成大頂堆
        big_heap(array, 0, end - 1)
    return array
 
 
def big_heap(array, start, end):
    root = start
    # 左孩子的索引
    child = root * 2 + 1
    while child = end:
        # 節(jié)點(diǎn)有右子節(jié)點(diǎn),并且右子節(jié)點(diǎn)的值大于左子節(jié)點(diǎn),則將child變?yōu)橛易庸?jié)點(diǎn)的索引
        if child + 1 = end and array[child]  array[child + 1]:
            child += 1
        if array[root]  array[child]:
            # 交換節(jié)點(diǎn)與子節(jié)點(diǎn)中較大者的值
            array[root], array[child] = array[child], array[root]
            # 交換值后,如果存在孫節(jié)點(diǎn),則將root設(shè)置為子節(jié)點(diǎn),繼續(xù)與孫節(jié)點(diǎn)進(jìn)行比較
            root = child
            child = root * 2 + 1
        else:
            break
 
 
if __name__ == '__main__':
    array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
    print(heap_sort(array))

運(yùn)行結(jié)果:

[5, 7, 10, 15, 17, 21, 24, 27, 30, 36, 45, 50]

代碼中,先實(shí)現(xiàn)一個(gè)big_heap(array, start, end)函數(shù),用于比較節(jié)點(diǎn)與其子節(jié)點(diǎn)中的較大者,如果值小于子節(jié)點(diǎn)的值則進(jìn)行交換。代碼中不需要真正將數(shù)據(jù)都添加到完全二叉樹中,而是根據(jù)待排序列表中的數(shù)據(jù)索引來得到節(jié)點(diǎn)與子節(jié)點(diǎn)的位置關(guān)系。完全二叉樹中,節(jié)點(diǎn)的索引為i,則它的左子節(jié)點(diǎn)的索引為2*i+1,右子節(jié)點(diǎn)的索引為2*i+2,有n個(gè)節(jié)點(diǎn)的完全二叉樹中,非葉子節(jié)點(diǎn)有n//2個(gè),列表的索引從0開始,所以索引為0~n//2-1的數(shù)據(jù)為非葉子節(jié)點(diǎn)。

實(shí)現(xiàn)堆排序函數(shù)heap_sort(array)時(shí),先調(diào)用big_heap(array, start, end)函數(shù)循環(huán)對(duì)非葉子節(jié)點(diǎn)進(jìn)行調(diào)整,構(gòu)造大頂堆,然后將堆頂和堆尾交換,將堆尾從堆中取出,添加到已排序序列中,完成一輪堆排序。然后循環(huán)構(gòu)建大頂堆,每次將最大的元素取出,直到堆中的數(shù)據(jù)全部被取出。

四、堆排序的時(shí)間復(fù)雜度和穩(wěn)定性

1. 時(shí)間復(fù)雜度

在堆排序中,構(gòu)建一次大頂堆可以取出一個(gè)元素,完成一輪堆排序,一共需要進(jìn)行n輪堆排序。每次構(gòu)建大頂堆時(shí),需要進(jìn)行的比較和交換次數(shù)平均為logn(第一輪構(gòu)建堆時(shí)步驟多,后面重建堆時(shí)步驟會(huì)少很多)。時(shí)間復(fù)雜度為 T(n)=nlogn ,再乘每次操作的步驟數(shù)(常數(shù),不影響大O記法),所以堆排序的時(shí)間復(fù)雜度為 O(nlogn) 。

2. 穩(wěn)定性

在堆排序中,會(huì)交換節(jié)點(diǎn)與子節(jié)點(diǎn),如果有相等的數(shù)據(jù),可能會(huì)改變相等數(shù)據(jù)的相對(duì)次序。所以堆排序是一種不穩(wěn)定的排序算法。

到此這篇關(guān)于Python實(shí)現(xiàn)堆排序案例詳解的文章就介紹到這了,更多相關(guān)Python實(shí)現(xiàn)堆排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 如何利用Python動(dòng)態(tài)展示排序算法
  • Python 列表排序詳解
  • python編程冒泡排序法實(shí)現(xiàn)動(dòng)圖排序示例解析
  • python教程對(duì)函數(shù)中的參數(shù)進(jìn)行排序
  • python數(shù)據(jù)結(jié)構(gòu)的排序算法
  • python如何實(shí)現(xiàn)常用的五種排序算法詳解
  • Python 數(shù)據(jù)結(jié)構(gòu)之十大經(jīng)典排序算法一文通關(guān)

標(biāo)簽:吉安 廣西 安康 呂梁 懷化 紹興 蘭州 蕪湖

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python實(shí)現(xiàn)堆排序案例詳解》,本文關(guān)鍵詞  Python,實(shí)現(xiàn),堆,排序,案例,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python實(shí)現(xiàn)堆排序案例詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Python實(shí)現(xiàn)堆排序案例詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产一区二区精品久久91| 精品国产香蕉在线播出| 美女免费精品高清毛片在线视 | 青青青草视频在线观看| 日韩专区一区| 欧美国产日韩精品| 成人高清视频免费观看| 国产成人精品综合久久久| 欧美爱色| 成人免费观看的视频黄页| 你懂的国产精品| 国产不卡在线观看视频| 欧美a免费| 国产一区二区精品在线观看| 亚欧乱色一区二区三区| 国产伦久视频免费观看 视频| 欧美激情在线精品video| 国产亚洲免费观看| 青青久久网| 久久国产精品自由自在| 日韩免费在线观看视频| 欧美日本韩国| 中文字幕97| 欧美激情一区二区三区视频 | 成人免费一级毛片在线播放视频| 国产高清在线精品一区a| 日韩中文字幕在线播放| 日日夜夜婷婷| 国产91精品露脸国语对白| 久草免费在线视频| 天天做日日干| 高清一级片| 一级片片| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 99色播| 亚洲女人国产香蕉久久精品| 成人a级高清视频在线观看| 欧美激情在线精品video| 天天色色色| 韩国三级香港三级日本三级| 国产精品自拍亚洲| 二级特黄绝大片免费视频大片| 一本高清在线| 欧美大片aaaa一级毛片| 久久国产影院| 成人a大片在线观看| 国产麻豆精品| 午夜久久网| 精品国产亚洲人成在线| 国产一级强片在线观看| 欧美激情影院| 日本免费乱理伦片在线观看2018| 久久久成人影院| 免费毛片基地| 国产原创中文字幕| 日本伦理片网站| 韩国三级香港三级日本三级la| 欧美大片一区| 99久久精品国产国产毛片| 九九精品影院| 青青青草影院| 精品视频在线观看一区二区三区| 日韩专区亚洲综合久久| 亚欧成人乱码一区二区| 99色播| 九九热国产视频| 精品视频免费看| 国产成人精品综合| 欧美激情伊人| 亚洲天堂免费| 久久国产精品永久免费网站| 高清一级毛片一本到免费观看| 国产网站在线| 国产成人精品影视| 久久国产精品自线拍免费| 久久国产精品自线拍免费| 久久久久久久久综合影视网| 日本在线不卡视频| 欧美激情一区二区三区在线 | 久久国产精品自由自在| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日本在线不卡视频| 国产激情一区二区三区| 亚洲精品久久久中文字| 国产网站免费观看| 香蕉视频久久| 欧美a级片免费看| 久久国产精品永久免费网站| 韩国三级视频网站| 韩国三级香港三级日本三级| 亚飞与亚基在线观看| 国产伦理精品| 在线观看成人网| 久草免费在线视频| 国产网站免费| 久久国产影视免费精品| 国产美女在线观看| 韩国三级视频网站| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 一级女性全黄久久生活片| 毛片电影网| 欧美日本韩国| 午夜激情视频在线观看 | 黄视频网站免费看| a级毛片免费观看网站| 久久精品大片| 欧美激情一区二区三区在线播放 | 亚洲精品中文一区不卡| 欧美大片aaaa一级毛片| 欧美一级视频高清片| 午夜久久网| 久草免费在线色站| 日日夜夜婷婷| 午夜激情视频在线播放| 国产91丝袜在线播放0| 成人高清免费| 日本特黄特色aaa大片免费| 一本高清在线| 韩国三级视频网站| 欧美a级片免费看| 99久久精品费精品国产一区二区| 在线观看成人网| 国产视频一区二区在线观看| 亚洲爆爽| 韩国三级香港三级日本三级| 成人高清视频免费观看| 九九精品在线| 欧美电影免费| 一级毛片视频免费| 亚洲第一页乱| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产美女在线观看| 色综合久久天天综线观看| 99久久精品国产高清一区二区| 日本在线播放一区| 黄色福利| 亚洲 男人 天堂| 国产91丝袜高跟系列| 色综合久久天天综合| 香蕉视频久久| 国产麻豆精品| 精品视频在线观看一区二区三区| 在线观看成人网| 午夜在线亚洲| 日韩欧美一及在线播放| 日韩专区亚洲综合久久| 九九免费高清在线观看视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 亚洲 欧美 成人日韩| 久久国产精品自线拍免费| 国产成人精品综合| 一级女性全黄生活片免费| 国产网站免费视频| 午夜在线亚洲| 一本高清在线| 欧美a级片免费看| 国产不卡在线观看视频| 91麻豆高清国产在线播放| 亚久久伊人精品青青草原2020| 亚飞与亚基在线观看| 日韩在线观看免费完整版视频| 黄色福利片| 久久精品道一区二区三区| 国产韩国精品一区二区三区| 午夜激情视频在线观看 | 欧美激情一区二区三区视频高清 | 久久久成人影院| 深夜做爰性大片中文| 国产综合91天堂亚洲国产| 精品视频一区二区三区| 国产91精品系列在线观看| 色综合久久天天综线观看| 欧美激情在线精品video| 国产一级强片在线观看| 精品国产一级毛片| 精品视频一区二区三区| 欧美另类videosbestsex视频| 精品久久久久久中文| 黄视频网站免费| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 999久久狠狠免费精品| 四虎影视库国产精品一区| 成人高清免费| 深夜做爰性大片中文| 青青久久国产成人免费网站| 日韩中文字幕在线观看视频| 欧美另类videosbestsex高清 | 日韩在线观看免费| 台湾毛片| 亚欧视频在线| 九九精品影院| 日本在线www| 日韩免费在线观看视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 青青青草视频在线观看| 成人免费观看视频| 国产91丝袜在线播放0| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | a级黄色毛片免费播放视频| 日韩男人天堂|