Scala实现堆排序

Scala实现堆排序

相关内容 & 算法详解

堆排序(递归)C++实现

环境

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 

鸣谢

算法导论

最后

  • 上述伪代码来自算法导论
  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值