堆积排序的灵魂在于adjust函数,就和快速排序的灵魂在于partition函数。
import leet.ArrayUtils
/**
* Created by fhqplzj on 16-9-29 at 上午9:59.
*/
object HeapSort {
def adjust(nums: Array[Int], p: Int, r: Int): Unit = {
val x = nums(p)
var q = 2 * p + 1
var flag = true
while (flag && q <= r) {
if (q < r && nums(q) < nums(q + 1)) {
q += 1
}
if (nums(q) <= x) {
flag = false
} else {
nums((q - 1) / 2) = nums(q)
q = 2 * q + 1
}
}
nums((q - 1) / 2) = x
}
def heapSort(nums: Array[Int]): Unit = {
val n = nums.length
for (i <- ((n - 1) / 2).to(0, -1)) {
adjust(nums, i, n - 1)
}
for (i <- (n - 2).to(0, -1)) {
ArrayUtils.swap(nums, 0, i + 1)
adjust(nums, 0, i)
}
}
def main(args: Array[String]): Unit = {
val nums = ArrayUtils.generateRandomIntArray(0, 50, 30)
println(nums.mkString(","))
heapSort(nums)
println(nums.mkString(","))
}
}