Scala练习-堆排序
来源:互联网 发布:视频监控录像软件 编辑:程序博客网 时间:2024/05/22 17:18
源码地址
package day14import scala.collection.mutable.ArrayBuffer/** * Created by doctorq on 2017/6/19. * 堆排序:采用大顶堆,根节点大于两层元素,该类需要满足具备三个方法: 1.由正常数组变换为符合堆结构的方法 * 2.向堆中插入数据。3.从堆中删除数据。 * 重要特性:1.根节点索引值为i,根节点元素满足Key[i]>=Key[2i+1]&&key>=key[2i+2] * 2.非叶子节点数量<=总节点数的/2 */object HeapSort extends App { /** * 生成对结构 * * @param unSortHeap 任意数组 * @return 符合堆结构的数组 */ def generateHeap(unSortHeap: Array[Int]): Array[Int] = { val num = unSortHeap.length if (num <= 1) return unSortHeap var tempUnSortHeap = unSortHeap for (i <- num / 2 - 1 until num) { tempUnSortHeap = sort(tempUnSortHeap, i) } tempUnSortHeap } /** * 排序特定子树 * * @param heap 未排序堆 * @param index 当前排序索引值 * @return 某子树已经排序完 */ def sort(heap: Array[Int], index: Int): Array[Int] = { //父节点 var childIndex = index var parentIndex = (childIndex - 1) / 2 var temp = heap(childIndex) while (parentIndex >= 0 && childIndex != 0) { if (heap(parentIndex) < temp) { //swap heap(childIndex) = heap(parentIndex) heap(parentIndex) = temp } childIndex = parentIndex parentIndex = (childIndex - 1) / 2 temp = heap(childIndex) } heap } /** * 从堆中删除数据 * * @param sortedHeap 已排序的队列 * @param index 索引值 */ def deleteFromHeap(sortedHeap: Array[Int], index: Int): Array[Int] = { val newArray = sortedHeap.toBuffer newArray.remove(index) generateHeap(newArray.toArray) } /** * 向堆中插入数据 * * @param sortedHeap 已排序的队列 * @param newElement 添加到对中的元素 */ def insertToHeap(sortedHeap: Array[Int], newElement: Int): Array[Int] = { val newList = sortedHeap :+ newElement sort(newList, newList.length - 1) } def printlnList(sortedHeap: Array[Int]): Unit = { sortedHeap.foreach(item => print(s"$item ")) println("sorted!") // for (k <- sortedHeap.indices) { // println(s"($k->${sortedHeap(k)})") // } } private def sortAll = { while (sortedList.length > 0) { print(s"${sortedList.head} ") sortedList = generateHeap(sortedList.tail) // printlnList(sortedList) } } val list = Array[Int](1, 4, 3, 5, 6, 8, 2, 3, 89, 4, 34, 50) var sortedList = generateHeap(list) printlnList(sortedList) //添加新元素 printlnList(insertToHeap(sortedList, 76)) //删除 printlnList(deleteFromHeap(sortedList, 3)) //堆排序,按大到小输出元素 sortAll}
阅读全文
0 0
- Scala练习-堆排序
- Scala练习-快速排序
- Scala练习-冒泡排序
- Scala练习-归并排序
- Scala练习-希尔排序
- Scala练习-选择排序
- Scala练习-桶排序
- scala 排序算法 堆排序
- 编程练习:堆排序
- [每日练习]堆排序
- 堆排序练习代码
- 堆排序的练习
- Kotlin练习-堆排序
- Scala练习-直接插入排序
- Scala练习-排序算法总结
- 算法练习二 堆排序
- 堆排序练习:POJ 2388
- 堆排序练习(手痒)
- 金蝶EAS·BOS,Java代码新增职位信息
- Codeforces Round #420 (Div. 2) C. Okabe and Boxes 栈+last标记+贪心
- 一分钟了解“Matlab抹去图像边界的无效像素”
- RSA算法原理(二)
- BMP文件学习笔记(一): C/C++语言实现.bmp文件读写
- Scala练习-堆排序
- MinGW 安装与CLion IDE环境配置
- 取模和取余的区别
- Servlet/Filter路径匹配规则
- 821B
- 人月神话
- 搭建selenium + python环境
- No mapping found for HTTP request with URI
- JSON与XML的区别比较