scala数据结构和算法-08-堆排序
来源:互联网 发布:mac装windows分区设置 编辑:程序博客网 时间:2024/05/20 16:41
二叉堆满足二个特性:
1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。
2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。
当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。下图展示一个最小堆:
由于其它几种堆(二项式堆,斐波纳契堆等)用的较少,一般将二叉堆就简称为堆。
堆的存储
一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。
package dataimport scala.collection.mutable.ListBufferobject HeapSort { def buildHeap[T](comparator:(T,T)=>Boolean)(source:ListBuffer[T],parent:Int){ if(left(parent)>=source.length){ return }else{ buildHeap(comparator)(source,left(parent)); } if(right(parent)>=source.length){ return }else{ buildHeap(comparator)(source,right(parent)); } if(comparator(source(left(parent)),source(parent)) &&comparator(source(right(parent)),source(parent))){ if(comparator(source(left(parent)),source(right(parent)))){ val p=source(parent) source(parent)=source(left(parent)) source(left(parent))=p buildHeap(comparator)(source,left(parent)) }else{ val p=source(parent) source(parent)=source(right(parent)) source(right(parent))=p buildHeap(comparator)(source,right(parent)) } }else if(comparator(source(left(parent)),source(parent))){ val p=source(parent) source(parent)=source(left(parent)) source(left(parent))=p buildHeap(comparator)(source,left(parent)) }else if(comparator(source(right(parent)),source(parent))){ val p=source(parent) source(parent)=source(right(parent)) source(right(parent))=p buildHeap(comparator)(source,right(parent)) } } def left(parent:Int)={ parent*2+1 } def right(parent:Int)={ parent*2+2 } def heapfye[T](comparator:(T,T)=>Boolean)(source:ListBuffer[T],parent:Int,rightIndex:Int){ if(left(parent)>rightIndex){ return } /*if(right(parent)>rightIndex){ return }*/ if(left(parent)<=rightIndex&&right(parent)>rightIndex){ if(comparator(source(left(parent)),source(parent))){ val p=source(parent) source(parent)=source(left(parent)) source(left(parent))=p heapfye(comparator)(source,left(parent),rightIndex) } }else{ if(comparator(source(left(parent)),source(parent)) &&comparator(source(right(parent)),source(parent))){ if(comparator(source(left(parent)),source(right(parent)))){ val p=source(parent) source(parent)=source(left(parent)) source(left(parent))=p heapfye(comparator)(source,left(parent),rightIndex) }else{ val p=source(parent) source(parent)=source(right(parent)) source(right(parent))=p heapfye(comparator)(source,right(parent),rightIndex) } }else if(comparator(source(left(parent)),source(parent))){ val p=source(parent) source(parent)=source(left(parent)) source(left(parent))=p heapfye(comparator)(source,left(parent),rightIndex) }else if(comparator(source(right(parent)),source(parent))){ val p=source(parent) source(parent)=source(right(parent)) source(right(parent))=p heapfye(comparator)(source,right(parent),rightIndex) } } } def heapSort[T](comparator:(T,T)=>Boolean)(source:ListBuffer[T],rightIndex:Int):ListBuffer[T]={ for(i<-(1 until source.length).reverse){ val tmp=source(i) source(i)=source(0) source(0)=tmp; heapfye(comparator)(source,0,i-1) } source } def main(args: Array[String]): Unit = { val source=ListBuffer(3,1,4,9,5,8,7) buildHeap[Int](_>_)(source,0) println(source.mkString(",")) println(heapSort[Int](_>_)(source,source.length-1).mkString(",")) }}
0 0
- scala数据结构和算法-08-堆排序
- scala数据结构和算法-07-希尔排序
- scala数据结构和算法-10-计数排序
- scala 排序算法 堆排序
- scala数据结构和算法-01-用scala实现合并排序
- 【scala 数据结构和算法】Scala实现:冒泡排序
- 【scala 数据结构和算法】Scala实现:快速排序
- 【scala 数据结构和算法】Scala实现:归并排序
- 【数据结构和算法16】堆排序
- 【数据结构&&算法】堆排序
- [数据结构] 堆排序算法
- 数据结构:排序算法之堆排序和选择排序
- 【数据结构】浅谈算法和数据结构:优先队列和堆排序
- scala数据结构和算法-03-冒泡排序实现
- scala数据结构和算法-04-快速排序实现
- scala数据结构和算法-05-插入排序实现
- scala数据结构和算法-09-基于插入排序的基数排序
- 【数据结构与算法】堆排序
- GNU Radio 运行出现错误 : SyntaxError: Non-ASCII character '\xe6' in file
- 【计算机历史的考古】
- VS中“转到定义”提示“未能找到符号”的解决方法
- java用split分割字符串
- vs2013配置OpenGL开发环境
- scala数据结构和算法-08-堆排序
- java泛型编程学习 笔记二:使用泛型的约束和局限性
- SQL Server 实现单列累积乘
- android之App的格式设置
- git进阶之--merge的5种策略
- VPN连接不上解决
- session是什么
- Servlet技术浅析(二)之HttpServlet抽象类
- JdbcTemplate简介