演算法 最大堆實現排序(從大到小輸出) 原創技術

2021-06-06 10:16:12 字數 1097 閱讀 2495

最大堆實現排序(從大到小輸出)

示例輸入(11個數,第乙個數表示元素個數):100

1234

5678

9示例輸出:98

7654

3210

堆和優先佇列

在電腦科學中,堆是一種經過排序的樹形資料結構,每個結點都有乙個值。通常我們所說的堆的資料結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是乙個堆。由於堆的這個特性,常用來實現優先佇列,也用於排序演算法,如堆排序。

優先佇列(priority  queue),不同於先進先出佇列的另一種佇列。每次從佇列中取出的是具有最高優先權的元素。優先佇列是0個或多個元素的集合,每個元素都有乙個優先權或值。

最大堆maxheap

在起始索引為 0 的堆中

1)堆的根節點將存放在位置 0

2)節點i的左子節點在位置2*i+1

3)節點i的右子節點在位置2*i+2

4)節點i的父節點在位置floor((i-1)/2)

siftup(int  i):第i個元素上移,最多執行logn次元素比較;對堆中某個關鍵字進行修改,大於父結點鍵值時,執行上移操作,恢復堆的性質。

siftdown(int  i):第i個元素下移;對堆中某個關鍵字進行修改,與其子結點中值較大的乙個進行比較,小於子結點鍵值時,執行下移操作,恢復堆的性質。

push(type  x):在佇列中追加元素;堆大小增加1,元素放在堆的末端,執行向上篩選。

pop():彈出元素;彈出最大(最小)堆的首元素,滿足優先性質。

top():取得首元素元素值;取得最大(最小)堆的首元素,滿足優先性質。

堆排序可利用堆性質,對序列進行排序。假定陣列a元素個數為n,陣列構建為堆後,根據最大堆性質,根結點a[0]即為最大元素;

交換a[0]、a[n-1],a[n-1]為最大元素;相當於刪掉a[n-1],堆元素個數減1;交換到a[0]的元素破壞了堆的性質,需對a[0]作下篩操作,恢復堆的結構;此時元素個數為n-1;繼續,直至元素個數為1。

源**:

更多詳細內容:::::去學習

python 比較數字大小按從大到小輸出

主要用到的python 的知識點 1 內建函式max 2 列表的操作 3 while 迴圈 4 錯誤處理 如下 usr bin python coding utf8 w x int raw input 請你輸入要比較數字總共的數量 for i in range x a int raw input 請...

將n個數按從大到小輸出(C語言)

用陣列儲存需要排序的數,用for迴圈輸入需要排序的數,用氣泡排序法對n個數進行排序,最後用for迴圈輸出排好的數 輸入需要排序的數 for i 0 i n i 氣泡排序法進行排序 for int j 0 j n 1 j 輸出排好的數 printf n輸出排序後的數 for i 0 i n i 源 i...

將三個數按從大到小輸出

解法一 if的迴圈巢狀 include int main else else else else else return 0 易錯點 多層if迴圈時造成混亂,無法理清題目 建議 先假設乙個變數最大,在此情況下分析其餘的兩個變數 再從內層向外層逐步分析 但是,這樣多的if語句很容易造成錯誤,所以用sw...