日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

堆排序时间复杂度_堆排序算法

發(fā)布時(shí)間:2025/6/17 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆排序时间复杂度_堆排序算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

堆排序是指利用堆積樹這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法,它是選擇排序的一種。可以利用數(shù)組的特點(diǎn)快速定位指定索引的元素。堆是一個(gè)優(yōu)先級(jí)隊(duì)列,對(duì)于大頂堆而言,堆頂元素的權(quán)值最大。將待排序的數(shù)組建堆,然后不斷地刪除堆頂元素,就實(shí)現(xiàn)了排序。

堆排序基本思想

將待排序序列構(gòu)造成一個(gè)大頂堆,此時(shí),整個(gè)序列的最大值就是堆頂?shù)母?jié)點(diǎn)。將其與末尾元素進(jìn)行交換,此時(shí)末尾就為最大值。然后將剩余n-1個(gè)元素重新構(gòu)造成一個(gè)堆,這樣會(huì)得到n個(gè)元素的次小值。如此反復(fù)執(zhí)行,便能得到一個(gè)有序序列。

堆是具有下列性質(zhì)的完全二叉樹:每個(gè)節(jié)點(diǎn)的值都大于或等于其左右孩子節(jié)點(diǎn)的值,稱為大根堆;每個(gè)節(jié)點(diǎn)的值都小于或等于其左右孩子節(jié)點(diǎn)的值,稱為小根堆。堆排序的最壞時(shí)間復(fù)雜度為O(n*log2n),平均時(shí)間復(fù)雜度為O(n*log2n)。

堆排序算法復(fù)雜度

對(duì)N個(gè)元素建堆的時(shí)間復(fù)雜度為O(N),刪除堆頂元素的時(shí)間復(fù)雜度為O(logN),盡管隨著元素的不斷刪除,堆的調(diào)度越來越小,但是總的而言,刪除堆所有元素的時(shí)間復(fù)雜度為O(NlogN)。故堆排序的時(shí)間復(fù)雜度為O(NlogN),空間復(fù)雜度為O(1)。

對(duì)于堆排序而言,數(shù)據(jù)的初始順序?qū)λ膹?fù)雜度沒有影響。不管數(shù)組初始時(shí)就是有序的還是逆序的,它都會(huì)先建堆,變成了堆序的性質(zhì)。從這點(diǎn)上分析,堆排序是一個(gè)非常穩(wěn)定的算法,最壞和平均情況下的時(shí)間復(fù)雜度都為O(NlogN)。

堆排序的步驟

大根堆有一個(gè)很好的性質(zhì),根節(jié)點(diǎn)的數(shù)值總是大于其他所有節(jié)點(diǎn)的數(shù)值,利用大根堆的這個(gè)性質(zhì),可以實(shí)現(xiàn)排序的工作。步驟如下:

1、構(gòu)建大根堆。首先我們的原始數(shù)組一般情況下是不滿足堆的條件,既然我們要可用大根段的性質(zhì)進(jìn)行排序,第一步當(dāng)然是對(duì)原始數(shù)組進(jìn)行處理,構(gòu)建大根堆。

2、根節(jié)點(diǎn)數(shù)據(jù)處理以及大根堆重構(gòu)。構(gòu)建大根堆元素之后,根節(jié)點(diǎn)的元素是最大值。然后將該數(shù)值取出,對(duì)剩下的元素進(jìn)行重構(gòu)大根堆,這時(shí)根節(jié)點(diǎn)是剩下元素的最大值,取出。只要不斷重復(fù)上述的操作,不斷取出未排序元素的最大值,直到未排序的元素只剩一個(gè),就完成了排序工作。

堆排序算法分析

堆排序的運(yùn)行時(shí)間主要是消耗在初始構(gòu)建堆和在重建堆時(shí)的反復(fù)篩選上。在構(gòu)建堆的過程中,因?yàn)槲覀兪峭耆鏄鋸淖钕聦幼钣疫叺姆墙K端結(jié)點(diǎn)開始構(gòu)建,將它與其孩子進(jìn)行比較和若有必要的互換,對(duì)于每個(gè)非終端結(jié)點(diǎn)來說,其實(shí)最多進(jìn)行兩次比較和互換操作,因此整個(gè)構(gòu)建堆的時(shí)間復(fù)雜度為O(n)。

在正式排序時(shí),第i次取堆頂記錄重建堆需要用O(logi)的時(shí)間(完全二叉樹的某個(gè)結(jié)點(diǎn)到根結(jié)點(diǎn)的距離為log2i+1),并且需要取n-1次堆頂記錄,因此,重建堆的時(shí)間復(fù)雜度為O(nlogn)。

總體來說,堆排序的時(shí)間復(fù)雜度為O(nlogn)。由于堆排序?qū)υ加涗浀呐判驙顟B(tài)并不敏感,因此它無論是最好、最壞和平均時(shí)間復(fù)雜度均為O(nlogn)。這在性能上顯然要遠(yuǎn)遠(yuǎn)好過于冒泡、簡單選擇、直接插入的O(n2)的時(shí)間復(fù)雜度。

再簡單總結(jié)下堆排序的基本思路:

A、將無需序列構(gòu)建成一個(gè)堆,根據(jù)升序降序需求選擇大頂堆或小頂堆;

B、將堆頂元素與末尾元素交換,將最大元素"沉"到數(shù)組末端;

C、重新調(diào)整結(jié)構(gòu),使其滿足堆定義,然后繼續(xù)交換堆頂元素與當(dāng)前末尾元素,反復(fù)執(zhí)行調(diào)整和交換步驟,直到整個(gè)序列有序。

最后

堆排序是一種選擇排序,整體主要由構(gòu)建初始堆+交換堆頂元素和末尾元素并重建堆兩部分組成。其中構(gòu)建初始堆經(jīng)推導(dǎo)復(fù)雜度為O(n),在交換并重建堆的過程中,元素需交換n-1次,而重建堆的過程中,根據(jù)完全二叉樹的性質(zhì),[log2(n-1),log2(n-2)...1]逐步遞減,近似為nlogn。所以堆排序時(shí)間復(fù)雜度一般認(rèn)為就是O(nlogn)級(jí)。

總結(jié)

以上是生活随笔為你收集整理的堆排序时间复杂度_堆排序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。