最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2023年08月14日 09:30:36   作者:跡憶客  
堆排序是一種強(qiáng)大的算法,用于在 Python 中對(duì)數(shù)組和列表進(jìn)行排序, 它很受歡迎,因?yàn)樗浅??并且不像合并排序和快速排序那樣占用任何額外空間,本篇文章將介紹堆排序算法在 Python 中的實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧

本篇文章將介紹堆排序算法在 Python 中的實(shí)現(xiàn)。

Python中的堆排序算法

堆排序是一種強(qiáng)大的算法,用于在 Python 中對(duì)數(shù)組和列表進(jìn)行排序。 它很受歡迎,因?yàn)樗浅?欤⑶也幌窈喜⑴判蚝涂焖倥判蚰菢诱加萌魏晤~外空間。

堆排序的時(shí)間復(fù)雜度是 O(n*log(n)) 。

堆排序是一種就地算法,它不再創(chuàng)建任何數(shù)據(jù)結(jié)構(gòu)來(lái)保存數(shù)據(jù)的中間狀態(tài)。 相反,它對(duì)我們的原始數(shù)組進(jìn)行了更改。

因此,當(dāng)數(shù)據(jù)非常大時(shí),這為我們節(jié)省了大量空間。

該算法唯一的缺點(diǎn)是它非常不穩(wěn)定。 如果我們的數(shù)組中有多個(gè)元素在不同索引處具有相同的值,則它們的位置將在排序時(shí)發(fā)生變化。

堆排序算法的工作原理是遞歸地創(chuàng)建一個(gè)最小或最大堆,取出根節(jié)點(diǎn),將其放在我們數(shù)組中的第一個(gè)未排序索引處,并將最后一個(gè)堆元素轉(zhuǎn)換為根節(jié)點(diǎn)。

這個(gè)過(guò)程遞歸重復(fù),直到我們?cè)诙阎辛粝乱粋€(gè)節(jié)點(diǎn)。 最后,最后一個(gè)堆元素被放置在我們數(shù)組的最后一個(gè)索引處。

如果我們想一想,這個(gè)過(guò)程類(lèi)似于選擇排序算法,因?yàn)槲覀內(nèi)∽畲笾祷蜃钚≈挡⑺鼈兎旁谝雅判驍?shù)組的頂部。

在 Python 中實(shí)現(xiàn)堆排序算法

我們將首先了解實(shí)現(xiàn) build_heap() 函數(shù),該函數(shù)采用原始數(shù)組、數(shù)組的長(zhǎng)度和父節(jié)點(diǎn)的索引。 在這里,如果我們查看一個(gè)數(shù)組,最后一個(gè)父節(jié)點(diǎn)的索引位于我們數(shù)組內(nèi)的 (n//2 - 1) 處。

類(lèi)似地,該特定父級(jí)的左孩子的索引為 2*parent_index + 1 ,右孩子的索引為 2*parent_index + 2 。

在這個(gè)例子中,我們?cè)噲D創(chuàng)建一個(gè)最大堆。 這意味著每個(gè)父節(jié)點(diǎn)都需要大于其子節(jié)點(diǎn)。

為此,我們將從最后一個(gè)父節(jié)點(diǎn)開(kāi)始,向上移動(dòng)到堆的根節(jié)點(diǎn)。 如果我們想創(chuàng)建一個(gè)最小堆,我們希望所有父節(jié)點(diǎn)都小于它們的子節(jié)點(diǎn)。

build_heap() 函數(shù)將檢查左或右子節(jié)點(diǎn)是否大于當(dāng)前父節(jié)點(diǎn),并將最大節(jié)點(diǎn)與父節(jié)點(diǎn)交換。

該函數(shù)遞歸地調(diào)用自身,因?yàn)槲覀兿M麑?duì)堆中的所有父節(jié)點(diǎn)遞增地重復(fù)之前的過(guò)程。

以下代碼片段演示了上述 built_heap() 函數(shù)在 Python 中的有效實(shí)現(xiàn)。

def build_heap(arr, length, parent_index):
    largest_index = parent_index
    left_index = 2 * parent_index + 1
    right_index = 2 * parent_index + 2
    if left_index < length and arr[parent_index] < arr[left_index]:
        largest_index = left_index
    if right_index < length and arr[largest_index] < arr[right_index]:
        largest_index = right_index
    if largest_index != parent_index:
        arr[parent_index],arr[largest_index] = arr[largest_index],arr[parent_index]
        build_heap(arr, length, largest_index)

現(xiàn)在,我們有一個(gè)函數(shù),它獲取數(shù)組中的最大值并將其放在堆的根部。 我們需要一個(gè)函數(shù)來(lái)獲取未排序的數(shù)組,調(diào)用 build_heap() 函數(shù)并從堆中提取元素。

以下代碼片段演示了 heapSort() 函數(shù)在 Python 中的實(shí)現(xiàn)。

def heapSort(arr):
    length = len(arr)
    for parent_index in range(length // 2 - 1, -1, -1):
        build_heap(arr, length, parent_index)
    for element_index in range(length-1, 0, -1):
        arr[element_index], arr[0] = arr[0], arr[element_index]
        build_heap(arr, element_index, 0)

我們?cè)跀?shù)組中逐步調(diào)用每個(gè)父節(jié)點(diǎn)的 build_heap() 函數(shù)。 請(qǐng)注意,我們將 length//2-1 作為起始索引,-1 作為結(jié)束索引,步長(zhǎng)為 -1。

這意味著我們從最后一個(gè)父節(jié)點(diǎn)開(kāi)始,遞減索引 1,直到到達(dá)根節(jié)點(diǎn)。

第二個(gè) for 循環(huán)從我們的堆中提取元素。 它也從最后一個(gè)索引開(kāi)始,并在我們數(shù)組的第一個(gè)索引處停止。

我們?cè)诖搜h(huán)中交換數(shù)組的第一個(gè)和最后一個(gè)元素,并通過(guò)傳遞 0 作為根索引對(duì)新排序的數(shù)組執(zhí)行 build_heap() 函數(shù)。

現(xiàn)在,我們已經(jīng)編寫(xiě)了用 Python 實(shí)現(xiàn)堆排序的程序。 是時(shí)候?qū)?shù)組進(jìn)行排序并測(cè)試上面編寫(xiě)的代碼了。

arr = [5, 3, 4, 2, 1, 6]
heapSort(arr)
print("Sorted array :", arr)

輸出:

Sorted array : [1, 2, 3, 4, 5, 6]

如我們所見(jiàn),我們的數(shù)組已完全排序。 這意味著我們的代碼工作得很好。

如果我們想按降序排序,我們可以創(chuàng)建一個(gè)最小堆而不是上面實(shí)現(xiàn)的最大堆。

本文不會(huì)解釋最小堆,因?yàn)樗呀?jīng)在本教程的開(kāi)頭討論了最小堆是什么。

我們的程序以下列方式工作。 以下塊顯示了我們的數(shù)組在代碼執(zhí)行的每個(gè)階段的狀態(tài)。

Original Array [5, 3, 4, 2, 1, 6] # input array
Building Heap [5, 3, 6, 2, 1, 4] # after build_heap() pass 1
Building Heap [5, 3, 6, 2, 1, 4] # after build_heap() pass 2
Building Heap [6, 3, 5, 2, 1, 4] # after build_heap() pass 3
Extracting Elements [6, 3, 5, 2, 1, 4] # before swapping and build_heap pass 1
Extracting Elements [5, 3, 4, 2, 1, 6] # before swapping and build_heap pass 2
Extracting Elements [4, 3, 1, 2, 5, 6] # before swapping and build_heap pass 3
Extracting Elements [3, 2, 1, 4, 5, 6] # before swapping and build_heap pass 4
Extracting Elements [2, 1, 3, 4, 5, 6] # before swapping and build_heap pass 5
Sorted array : [1, 2, 3, 4, 5, 6] # after swapping and build_heap pass 5

build_heap() 函數(shù)執(zhí)行了 3 次,因?yàn)槲覀兊亩阎兄挥?3 個(gè)父節(jié)點(diǎn)。

之后,我們的元素提取階段獲取第一個(gè)元素,將其與最后一個(gè)元素交換,然后再次執(zhí)行 build_heap() 函數(shù)。 對(duì)長(zhǎng)度 - 1 重復(fù)此過(guò)程,我們的數(shù)組得到排序。

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

相關(guān)文章

  • Python利器openpyxl之操作excel表格

    Python利器openpyxl之操作excel表格

    這篇文章主要給大家介紹了關(guān)于Python利器openpyxl之操作excel表格的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • python中分組函數(shù)groupby和分組運(yùn)算函數(shù)agg的使用

    python中分組函數(shù)groupby和分組運(yùn)算函數(shù)agg的使用

    本文主要介紹了python中分組函數(shù)groupby和分組運(yùn)算函數(shù)agg的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • python使用NumPy文件的讀寫(xiě)操作

    python使用NumPy文件的讀寫(xiě)操作

    這篇文章主要介紹了python使用NumPy讀寫(xiě)文本文件。想了解第三方庫(kù)文件操作的同學(xué),來(lái)看一下吧
    2021-04-04
  • python opencv 圖像拼接的實(shí)現(xiàn)方法

    python opencv 圖像拼接的實(shí)現(xiàn)方法

    高級(jí)圖像拼接也叫作基于特征匹配的圖像拼接,拼接時(shí)消去兩幅圖像相同的部分,實(shí)現(xiàn)拼接合成全景圖。這篇文章主要介紹了python opencv 圖像拼接,需要的朋友可以參考下
    2019-06-06
  • Python中的裝飾器用法詳解

    Python中的裝飾器用法詳解

    這篇文章主要介紹了Python中的裝飾器用法,以實(shí)例形式詳細(xì)的分析了Python中的裝飾器的使用技巧及相關(guān)注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • python獲取當(dāng)前文件路徑以及父文件路徑的方法

    python獲取當(dāng)前文件路徑以及父文件路徑的方法

    今天小編就為大家分享一篇python獲取當(dāng)前文件路徑以及父文件路徑的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • pandas DataFrame.shift()函數(shù)的具體使用

    pandas DataFrame.shift()函數(shù)的具體使用

    本文主要介紹了pandas DataFrame.shift()函數(shù)的使用,pandas DataFrame.shift()函數(shù)可以把數(shù)據(jù)移動(dòng)指定的位數(shù),有需要了解pandas DataFrame.shift()用法的朋友可以參考一下
    2021-05-05
  • 解決Pycharm下面出現(xiàn)No R interpreter defined的問(wèn)題

    解決Pycharm下面出現(xiàn)No R interpreter defined的問(wèn)題

    今天小編就為大家分享一篇解決Pycharm下面出現(xiàn)No R interpreter defined的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 聊聊Python String型列表求最值的問(wèn)題

    聊聊Python String型列表求最值的問(wèn)題

    這篇文章主要介紹了Python String型列表求最值的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Python使用迭代器捕獲Generator返回值的方法

    Python使用迭代器捕獲Generator返回值的方法

    這篇文章主要介紹了Python使用迭代器捕獲Generator返回值的方法,結(jié)合具體實(shí)例形式分析了Python迭代器獲取生成器返回值的相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04

最新評(píng)論

洛阳市| 阿尔山市| 青铜峡市| 修文县| 罗甸县| 怀柔区| 漯河市| 米泉市| 安义县| 犍为县| 皋兰县| 高尔夫| 延吉市| 东兴市| 宜良县| 仁布县| 苗栗市| 特克斯县| 崇文区| 嘉义县| 延边| 静乐县| 二手房| 英吉沙县| 海原县| 云阳县| 钦州市| 绍兴市| 巴彦淖尔市| 庄浪县| 桑植县| 当涂县| 密云县| 丰都县| 牙克石市| 景东| 垦利县| 博野县| 剑阁县| 安新县| 邳州市|