java手写算法_算法-手写堆

package heap

/**

* 根节点从1开始

* parent = k/2

* lchild = i * 2

* rchild = i * 2 +1

*/

class MaxHeap {

var mArr: IntArray

var mCount: Int = 0

constructor(size: Int) {

mArr = IntArray(size + 1)

}

fun insert(newVal: Int) {

assert(mCount + 1 < mArr.size)

mArr[++mCount] = newVal

shiftUp(mCount)

}

fun extractMax(): Int {

assert(mCount > 0)

var result = mArr[1]

if (mCount > 1) {

mArr[1] = mArr[mCount]

shiftDown(1)

}

mCount--

return result

}

fun isEmpty(): Boolean {

return mCount <= 0

}

private fun shiftUp(count: Int) {

var k = count

while (k > 1) {

if (mArr[k / 2] < mArr[k]) {

var tmp = mArr[k / 2]

mArr[k / 2] = mArr[k]

mArr[k] = tmp

}

k /= 2

}

}

private fun shiftDown(start: Int) {

var k = start//parent

var j = 2 * k

while (j <= mCount) {

//find max from its children

if (j + 1 <= mCount && mArr[j + 1] > mArr[j]) {

j++

}

//swap(k,j) when k < j

if (mArr[k] < mArr[j]) {

var tmp = mArr[k]

mArr[k] = mArr[j]

mArr[j] = tmp

}

k = j

j = 2 * k

}

}

}

fun main(args: Array) {

var maxHeap = MaxHeap(100)

for (i in 1..30) {

maxHeap.insert((Math.random() * 10).toInt())

}

while (!maxHeap.isEmpty()) {

println(maxHeap.extractMax())

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值