不淺顯不易懂,教你優雅的寫出堆排序演算法

2021-10-19 05:29:49 字數 1706 閱讀 3668

個人喜歡將堆排序設計為三個層次分三個函式層層遞進實現

解釋一些概念

(1)二叉堆:將元素(這裡不嚴謹的指代所有實數)按照二叉樹的結構以陣列下標對映的方式儲存。

對於每個元素,我們關心其與子節點間的大小關係(如果存在)

對於陣列下標為i的元素(從0開始)

其左子節點的下標(若存在)

lt =

2* i +

1;

其右子節點的下標為(若存在)

rt =

2* i +

2;

(2)大根堆對於每個結點,其相對於左右子節點的值,為最大(隱含著根節點為區域性大根堆最大值)

習慣上我們會建成乙個完全二叉樹形式的大根堆

補充完廢話,直接上**解析一哈

void

maxheapify

(vector<

int>

& nums,

int i,

int heapsize)

if(rt < heapsize && nums[rt]

> nums[largest])if

(largest != i)

//如果最大值不為當前結點

}

從第乙個非葉結點開始,向上遍歷將最大值放到根的位置

void

buildmaxheap

(vector<

int>

& nums,

int heapsize)

//對於每次遍歷,我們利用1中實現的子過程,實現了以當前結點為根的區域性大根堆的構建。在下一次遍歷中,其會作為子節點與新的上面的根作比較

}

這裡所說的插入實際上是對於第i次遍歷,我們把當前全域性大根堆根值與第i大元素應該存在的位置上的元素做交換

void

heapsort

(vector<

int>

& nums)

}

void

maxheapify

(vector<

int>

& nums,

int i,

int heapsize)

if(rt < heapsize && nums[rt]

> nums[largest])if

(largest != i)

}void

buildmaxheap

(vector<

int>

& nums,

int heapsize)

}void

heapsort

(vector<

int>

& nums)

}int

main

(void

)

讀者閱讀實現後,可以嘗試完成leetcode板子題ac進行練習

977.有序陣列的平方

睡了睡了

淺顯易懂的委託

一 我對委託的理解 委託是方法的容器,它不生產方法,它只是方法的搬運工。委託這個詞用到程式設計裡面對於很多新人來說可能都不太好理解,以前剛接觸委託的時候也看過不少文章,對於這個詞的解釋大多都雲裡霧裡。但把 委託 換成 託付 對於它的理解可能會清晰不少。例如,劉備將兒子委託給了趙雲和劉備將兒子託付給了...

淺顯易懂的桶排序

想準備將所有的排序演算法都總結出來,方便你查閱,也方便我複習和記憶,下面來說桶排序 首先必須申明,桶排序和計數排序完全不同,不可混為一談 這裡例項用單鏈表來操作 還是老方法,看文字就是煩,直接上圖,結合,永遠都是王道 1.假設 桶待排序列 看了之後有沒有特莫感覺就是雜湊桶,哈哈,滿足一定條件差不多就...

python中yield的用法 淺顯易懂

def consumer name print s 準備吃包子啦 name while true baozi yield return返回的值.print 包子 s 來了,被 s 吃了 baozi,name c consumer 小華 print 華麗分割線1 print c.next print ...