堆排序時間複雜度 堆排序演算法

2021-10-11 23:29:49 字數 1852 閱讀 1006

堆排序是指利用堆積樹這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆是乙個優先順序佇列,對於大頂堆而言,堆頂元素的權值最大。將待排序的數組建堆,然後不斷地刪除堆頂元素,就實現了排序。

堆排序基本思想

將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成乙個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列。

堆是具有下列性質的完全二叉樹:每個節點的值都大於或等於其左右孩子節點的值,稱為大根堆;每個節點的值都小於或等於其左右孩子節點的值,稱為小根堆。堆排序的最壞時間複雜度為o(n*log2n),平均時間複雜度為o(n*log2n)。

堆排序演算法複雜度

對n個元素建堆的時間複雜度為o(n),刪除堆頂元素的時間複雜度為o(logn),儘管隨著元素的不斷刪除,堆的排程越來越小,但是總的而言,刪除堆所有元素的時間複雜度為o(nlogn)。故堆排序的時間複雜度為o(nlogn),空間複雜度為o(1)。

對於堆排序而言,資料的初始順序對它的複雜度沒有影響。不管陣列初始時就是有序的還是逆序的,它都會先建堆,變成了堆序的性質。從這點上分析,堆排序是乙個非常穩定的演算法,最壞和平均情況下的時間複雜度都為o(nlogn)。

堆排序的步驟

大根堆有乙個很好的性質,根節點的數值總是大於其他所有節點的數值,利用大根堆的這個性質,可以實現排序的工作。步驟如下:

1、構建大根堆。首先我們的原始陣列一般情況下是不滿足堆的條件,既然我們要可用大根段的性質進行排序,第一步當然是對原始陣列進行處理,構建大根堆。

2、根節點資料處理以及大根堆重構。構建大根堆元素之後,根節點的元素是最大值。然後將該數值取出,對剩下的元素進行重構大根堆,這時根節點是剩下元素的最大值,取出。只要不斷重複上述的操作,不斷取出未排序元素的最大值,直到未排序的元素只剩乙個,就完成了排序工作。

堆排序演算法分析

堆排序的執行時間主要是消耗在初始構建堆和在重建堆時的反覆篩選上。在構建堆的過程中,因為我們是完全二叉樹從最下層最右邊的非終端結點開始構建,將它與其孩子進行比較和若有必要的互換,對於每個非終端結點來說,其實最多進行兩次比較和互換操作,因此整個構建堆的時間複雜度為o(n)。

在正式排序時,第i次取堆頂記錄重建堆需要用o(logi)的時間(完全二叉樹的某個結點到根結點的距離為log2i+1),並且需要取n-1次堆頂記錄,因此,重建堆的時間複雜度為o(nlogn)。

總體來說,堆排序的時間複雜度為o(nlogn)。由於堆排序對原始記錄的排序狀態並不敏感,因此它無論是最好、最壞和平均時間複雜度均為o(nlogn)。這在效能上顯然要遠遠好過於冒泡、簡單選擇、直接插入的o(n2)的時間複雜度。

再簡單總結下堆排序的基本思路:

a、將無需序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆;

b、將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端;

c、重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整和交換步驟,直到整個序列有序。

最後

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

堆排序時間複雜度 堆排序

科班出身的程式設計師就應該研究些演算法和資料結構類的東西,不然,有什麼優勢?堆排序,結構是完全二叉樹,選擇排序的一種,其流程控制和氣泡排序類似,每次選出乙個最大 或最小的元素 排出去,然後下一輪再選出乙個最大 最小的 以此類推,直到剩下乙個不能構成二叉樹為止也排出去,排出來的就是有序的了。只不過每次...

堆排序時間複雜度的理解

堆排序 這裡不再贅述堆的定義 和堆排序的講解,詳見海子的部落格 裡面圖示已經很清楚了,這裡首先對該部落格對我的啟發表示感謝。難點 1.對堆的理解 從堆的定義可以看出,堆有兩個性質 i.完全二叉樹 即按二叉樹逐層從左到右排列資料,這樣便於所以某個節點的父節點或者子節點 ii.大頂堆 或小頂堆 即任何父...

堆排序時間複雜度 基於PHP實現堆排序原理

每日17點準時技術乾貨分享 堆 堆 heap 是電腦科學中一類特殊的資料結構的統稱,通常是乙個可以被看做一棵樹的陣列物件。堆 ki k2i,ki k2i 1 ki k2i,ki k2i 1 i 1,2,3,4.n 2 關於堆 完全二叉樹 說到堆排序,就不能不提完全二叉樹,這些基本概念在網上到處都是,...