個人喜歡將堆排序設計為三個層次分三個函式層層遞進實現
解釋一些概念
(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 ...