Scala实现堆排序
相关内容 & 算法详解
环境
CentOS Linux release 8.1.1911 (Core)
Scala 2.13.3 (Java HotSpot(TM) 64-Bit Server VM, Java 14.0.2)
算法思路
在另一篇博客堆排序(递归)C++实现中已详细叙述并用C++
实现,此处只是使用Scala
进行简单复现,均基于算法导论提供的思想,算法思路便不再赘述
实现代码
object HeapSort {
var array : Array[Int] = Array(0, 20, 20, 0, 8, 0, 5, 21, 2)
var heapSize : Int = array.size
/**
* Description:
* 建立最大堆
* @param: Unit
* @return: Unit
*/
def buildMaxHeap() : Unit = {
for (i <- (1 to array.size / 2).reverse) {
// 从倒数第二层开始逐层向上调整
// 倒数第一层都是叶子节点不需要调整
maxHeapify(i)
}
}
/**
* Description:
* 最大堆调整方法,维护最大堆性质
* @param: i
* 对给定结点进行调整,使以其为根节点的子树维持最大堆性质
* @return: Unit
*/
def maxHeapify(i : Int) : Unit = {
var left : Int = 2 * i
var right : Int = 2 * i + 1
var largest : Int = i
// 找到左右孩子中关键字较大者与当前根节点交换
if (left < heapSize && array(left) > array(i)) {
largest = left
}
if (right < heapSize && array(right) > array(largest)) {
largest = right
}
// 若存在孩子节点比当前及节点大,交换,并递归继续调整
if (largest != i) {
var temp : Int = array(i)
array(i) = array(largest)
array(largest) = temp
maxHeapify(largest)
}
}
/**
* Description:
* 堆排序方法,每次将堆顶元素移动到序列最后,堆长度减一并调整堆
* @param: Unit
* @return: Unit
*/
def heapSort() : Unit = {
buildMaxHeap()
for (i <- (2 to array.size - 1).reverse) {
// 每次将堆顶元素(最大值)移动到序列最后,堆长度减一并调整堆
// 直到排序到第二个元素,排序结束
var temp : Int = array(1)
array(1) = array(i)
array(i) = temp
// 新堆长度为原堆长度减一
heapSize -= 1
// 调整
maxHeapify(1)
}
}
/**
* Description:
* 主函数
* @param: args
* 主函数参数
* @return: Unit
*/
def main(args : Array[String]) : Unit = {
for (i <- 1 to array.size - 1) {
printf("%d ", array(i))
}
println()
heapSort()
for (i <- 1 to array.size - 1) {
printf("%d ", array(i));
}
println()
}
}
测试结果
20 20 0 8 0 5 21 2
0 0 2 5 8 20 20 21
鸣谢
最后
- 上述伪代码来自算法导论
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解