堆排序时间复杂度_堆排序算法
堆排序是指利用堆積樹這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計的一種排序算法,它是選擇排序的一種。可以利用數(shù)組的特點(diǎn)快速定位指定索引的元素。堆是一個優(yōu)先級隊列,對于大頂堆而言,堆頂元素的權(quán)值最大。將待排序的數(shù)組建堆,然后不斷地刪除堆頂元素,就實(shí)現(xiàn)了排序。
堆排序基本思想
將待排序序列構(gòu)造成一個大頂堆,此時,整個序列的最大值就是堆頂?shù)母?jié)點(diǎn)。將其與末尾元素進(jìn)行交換,此時末尾就為最大值。然后將剩余n-1個元素重新構(gòu)造成一個堆,這樣會得到n個元素的次小值。如此反復(fù)執(zhí)行,便能得到一個有序序列。
堆是具有下列性質(zhì)的完全二叉樹:每個節(jié)點(diǎn)的值都大于或等于其左右孩子節(jié)點(diǎn)的值,稱為大根堆;每個節(jié)點(diǎn)的值都小于或等于其左右孩子節(jié)點(diǎn)的值,稱為小根堆。堆排序的最壞時間復(fù)雜度為O(n*log2n),平均時間復(fù)雜度為O(n*log2n)。
堆排序算法復(fù)雜度
對N個元素建堆的時間復(fù)雜度為O(N),刪除堆頂元素的時間復(fù)雜度為O(logN),盡管隨著元素的不斷刪除,堆的調(diào)度越來越小,但是總的而言,刪除堆所有元素的時間復(fù)雜度為O(NlogN)。故堆排序的時間復(fù)雜度為O(NlogN),空間復(fù)雜度為O(1)。
對于堆排序而言,數(shù)據(jù)的初始順序?qū)λ膹?fù)雜度沒有影響。不管數(shù)組初始時就是有序的還是逆序的,它都會先建堆,變成了堆序的性質(zhì)。從這點(diǎn)上分析,堆排序是一個非常穩(wěn)定的算法,最壞和平均情況下的時間復(fù)雜度都為O(NlogN)。
堆排序的步驟
大根堆有一個很好的性質(zhì),根節(jié)點(diǎn)的數(shù)值總是大于其他所有節(jié)點(diǎn)的數(shù)值,利用大根堆的這個性質(zhì),可以實(shí)現(xiàn)排序的工作。步驟如下:
1、構(gòu)建大根堆。首先我們的原始數(shù)組一般情況下是不滿足堆的條件,既然我們要可用大根段的性質(zhì)進(jìn)行排序,第一步當(dāng)然是對原始數(shù)組進(jìn)行處理,構(gòu)建大根堆。
2、根節(jié)點(diǎn)數(shù)據(jù)處理以及大根堆重構(gòu)。構(gòu)建大根堆元素之后,根節(jié)點(diǎn)的元素是最大值。然后將該數(shù)值取出,對剩下的元素進(jìn)行重構(gòu)大根堆,這時根節(jié)點(diǎn)是剩下元素的最大值,取出。只要不斷重復(fù)上述的操作,不斷取出未排序元素的最大值,直到未排序的元素只剩一個,就完成了排序工作。
堆排序算法分析
堆排序的運(yùn)行時間主要是消耗在初始構(gòu)建堆和在重建堆時的反復(fù)篩選上。在構(gòu)建堆的過程中,因為我們是完全二叉樹從最下層最右邊的非終端結(jié)點(diǎn)開始構(gòu)建,將它與其孩子進(jìn)行比較和若有必要的互換,對于每個非終端結(jié)點(diǎn)來說,其實(shí)最多進(jìn)行兩次比較和互換操作,因此整個構(gòu)建堆的時間復(fù)雜度為O(n)。
在正式排序時,第i次取堆頂記錄重建堆需要用O(logi)的時間(完全二叉樹的某個結(jié)點(diǎn)到根結(jié)點(diǎn)的距離為log2i+1),并且需要取n-1次堆頂記錄,因此,重建堆的時間復(fù)雜度為O(nlogn)。
總體來說,堆排序的時間復(fù)雜度為O(nlogn)。由于堆排序?qū)υ加涗浀呐判驙顟B(tài)并不敏感,因此它無論是最好、最壞和平均時間復(fù)雜度均為O(nlogn)。這在性能上顯然要遠(yuǎn)遠(yuǎn)好過于冒泡、簡單選擇、直接插入的O(n2)的時間復(fù)雜度。
再簡單總結(jié)下堆排序的基本思路:
A、將無需序列構(gòu)建成一個堆,根據(jù)升序降序需求選擇大頂堆或小頂堆;
B、將堆頂元素與末尾元素交換,將最大元素"沉"到數(shù)組末端;
C、重新調(diào)整結(jié)構(gòu),使其滿足堆定義,然后繼續(xù)交換堆頂元素與當(dāng)前末尾元素,反復(fù)執(zhí)行調(diào)整和交換步驟,直到整個序列有序。
最后
堆排序是一種選擇排序,整體主要由構(gòu)建初始堆+交換堆頂元素和末尾元素并重建堆兩部分組成。其中構(gòu)建初始堆經(jīng)推導(dǎo)復(fù)雜度為O(n),在交換并重建堆的過程中,元素需交換n-1次,而重建堆的過程中,根據(jù)完全二叉樹的性質(zhì),[log2(n-1),log2(n-2)...1]逐步遞減,近似為nlogn。所以堆排序時間復(fù)雜度一般認(rèn)為就是O(nlogn)級。
總結(jié)
以上是生活随笔為你收集整理的堆排序时间复杂度_堆排序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python调用数据库判断_python
- 下一篇: python计算运动会某个参赛选手的得分