排序 堆排序

2021-07-13 02:48:35 字數 686 閱讀 4349

1.概述

首先堆是具有下列性質的完全二叉樹:每個節點的值都大於或等於其左右節點的值,稱為最大堆。或者每個節點的值都小於或等於其左右孩子的值,稱為最小堆。

注意二叉堆採用的陣列的第乙個元素不用,這樣當節點為i時,2i為其左子節點,2i+1為qi右子節點,i/2為其父節點。

堆排序是利用最大堆進行排序的方法。基本思想是:將待排序的序列構造成乙個最大堆,整個序列的最大值就是堆頂的根節點。將其與堆陣列的末尾元素交換,此時末尾元素就是最大值。然後將剩餘n-1個序列構造成乙個堆,這樣就得到n個元素中的次最小值。如此反覆執行,便能得到乙個有序序列了。

2.實現

注意這裡堆排序用的陣列包含了位置0處的資料。所以與二叉堆的**會有一些的不同。

void swap(int &a,int &b)

void perdown(int a,int i,int n)

for(i=n-1;i>0;i--)

}

3.分析

執行時間主要消耗在初始構建堆和重建堆的反覆篩選上。

整個構造堆的時間複雜度是o(n),重建堆的時間複雜度o(nlgn)。總體來說,堆排序的時間複雜度是o(nlgn),堆排序對原始記錄的排序狀態並不敏感,因此它無論最好最壞和平均都是o(nlgn)。這在效能上都優於冒泡、簡單選擇、直接插入的o(n2)的時間複雜度。

堆排序是一種不穩定的排序方法。

堆排序 堆排序優化 索引堆排序

堆排序 堆排序優化 索引堆排序 注 堆排序 索引堆排序 都是不穩定的排序。注 索引最大堆排序有誤!有沒有大神可以指點一二?1 堆 所有元素 都從索引0開始 父親結點索引 i 左孩子結點索引 2i 1 右孩子結點索引 2i 2 左後乙個非葉子結點索引 n 1 2 用於構建堆,從最後乙個非葉子結點索引開...

堆排序 堆排序優化 索引堆排序

堆排序 堆排序優化 索引堆排序 注 堆排序 索引堆排序 都是不穩定的排序。注 索引最大堆排序有誤!有沒有大神可以指點一二?1 堆 所有元素 都從索引0開始 父親結點索引 i 左孩子結點索引 2i 1 右孩子結點索引 2i 2 左後乙個非葉子結點索引 n 1 2 用於構建堆,從最後乙個非葉子結點索引開...

堆排序 模擬堆排序

838.堆排序 輸入乙個長度為n的整數數列,從小到大輸出前m小的數。輸入格式 第一行包含整數n和m。第二行包含n個整數,表示整數數列。輸出格式 共一行,包含m個整數,表示整數數列中前m小的數。資料範圍 1 m n 1051 m n 105,1 數列中元素 1091 數列中元素 109 輸入樣例 5 ...