算法入门篇三 详解桶排序和整理排序知识 堆的相关操作 补充 不完整
生活随笔
收集整理的這篇文章主要介紹了
算法入门篇三 详解桶排序和整理排序知识 堆的相关操作 补充 不完整
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
歸并排序不使用遞歸
- 使用一個(gè)變量,使其按照1、2、4、8遞增,控制左右兩邊1個(gè)元素、2個(gè)元素、4個(gè)元素等元素的合并
完全二叉樹
- 完全二叉樹 要不全是滿的,要不葉子節(jié)點(diǎn)出現(xiàn)在最后一層,只要出現(xiàn)了葉子節(jié)點(diǎn),后面的都是葉子節(jié)點(diǎn)
- 完全二叉樹可以用數(shù)組下標(biāo)從0-7來表示,依據(jù)以下公式計(jì)算左節(jié)點(diǎn)、右節(jié)點(diǎn)和父節(jié)點(diǎn)
- 對(duì)于任意節(jié)點(diǎn) i?
- 左節(jié)點(diǎn)? 2*i+1
- 右節(jié)點(diǎn)? 2*i+2
- 父節(jié)點(diǎn)? (i-1)/2
堆
堆(完全二叉樹)
大根堆
- 在完全二叉樹上,每一個(gè)子樹的最大值都是頭節(jié)點(diǎn)
小根堆
- 在完全二叉樹上,每一個(gè)子樹的最小值都是頭節(jié)點(diǎn)
堆的插入和刪除操作是O(logn),構(gòu)建堆的操作是O(n)
堆的存儲(chǔ)方式不是鏈?zhǔn)酱鎯?chǔ),而是順序存儲(chǔ)。左孩子下標(biāo)是 2*parent +1;右孩子下標(biāo)是2 * parent+2
優(yōu)先隊(duì)列:比如最大優(yōu)先隊(duì)列,讓最大的元素出隊(duì),即使最大元素不在隊(duì)頭,他仍然是第一個(gè)出隊(duì),因?yàn)樗鼉?yōu)先級(jí)最高。優(yōu)先隊(duì)列的底層是使用大根堆來實(shí)現(xiàn)的。每一次入隊(duì)操作就是堆的插入操作,每一次出隊(duì)操作就是刪除堆頂點(diǎn)
因?yàn)槎娑训纳细『拖鲁恋臅r(shí)間復(fù)雜度都是O(logn),因此優(yōu)先隊(duì)列的入隊(duì)和出隊(duì)的時(shí)間復(fù)雜度也是O(logn)
例子
- 加入元素:數(shù)組下標(biāo)從0到7,按照輸入的順序加入到數(shù)組中,沒加入一個(gè)數(shù)組根據(jù)公式(i-1)/ 2來判定,他的父節(jié)點(diǎn)的位置,然后與父節(jié)點(diǎn)做比較,如果大于父節(jié)點(diǎn)則和父節(jié)點(diǎn)的位置交換。每加入一個(gè)元素,那么heapsize+1。heapsize用于指定堆的大小。
- 返回最大值:將大根堆的最頂端和最末尾的元素相互交換,然后將heapsize-1,返回最頂端的數(shù)值。末尾元素移到最頂端之后,需要找到它的左右兩個(gè)孩子節(jié)點(diǎn),做比較,如果有比它還大的孩子節(jié)點(diǎn)就進(jìn)行交換。依此類推。
- 數(shù)組擴(kuò)容:如果原始只分配一個(gè)字節(jié),動(dòng)態(tài)加入元素,進(jìn)行數(shù)組擴(kuò)容。那么需要log(N)次數(shù)的擴(kuò)容,最后需要拷貝N個(gè)數(shù)到擴(kuò)容完成后的數(shù)組中;因此代價(jià)是 N*log(N),如果取平均,最后代價(jià)是log(N)
完整代碼
- heapsort方法適用于 將元素插入數(shù)組,一個(gè)一個(gè)往里面放
- heapify 適用于如果將元素彈出的時(shí)候,將最小的元素放在頂端,看其是否下降
- 還不是很了解 這個(gè)代碼的含義
比較器的使用
- 實(shí)質(zhì):重載比較運(yùn)算符
- 比較器可以應(yīng)用在特殊標(biāo)準(zhǔn)的排序上
- 比較器可以應(yīng)用在特殊標(biāo)準(zhǔn)的排序結(jié)構(gòu)上
- 自己定義比較規(guī)則? 類似 C++運(yùn)算符號(hào)重載,比如定義一個(gè)學(xué)生結(jié)構(gòu)體,包含學(xué)生的名字、年齡和id;通過結(jié)構(gòu)的年齡的比較,進(jìn)行排序
堆排序的擴(kuò)展題目
- 已知一個(gè)幾乎有序的數(shù)組,幾乎有序是指,如果將數(shù)組排好順序的話,每個(gè)元素的移動(dòng)距離不超過k,并且k相對(duì)于數(shù)組來說比較小。請(qǐng)選擇一個(gè)合適的排序算法針對(duì)這個(gè)數(shù)據(jù)進(jìn)行排序
- 思路:使用一個(gè)大小為 k+1 的內(nèi)存空間,主要目的是要小根堆,先將k+1個(gè)元素放入申請(qǐng)的內(nèi)存空間,每次放入都需要進(jìn)行一次調(diào)整;此時(shí)0位置的元素是最小的元素;然后將0位置元素彈出,再將新的元素插入申請(qǐng)的空間,進(jìn)行調(diào)整。(每彈出一個(gè)首元素,再插入一個(gè)新的元素,整體調(diào)整)?(每個(gè)數(shù)進(jìn)入一次彈出一次,N*logk)
- ?
?
?
總結(jié)
以上是生活随笔為你收集整理的算法入门篇三 详解桶排序和整理排序知识 堆的相关操作 补充 不完整的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信长之野望14威力加强版 1600关原之
- 下一篇: 高温结束终于要降温了!京津冀等8省区市有