堆排序(小根堆)的简单实现(java)
堆排序是一种树形选择排序方法,它的特点是:在排序过程中,将L[1...n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的元素。
堆的定义如下:n个关键字序列L[1...n]称为堆,当且仅当该序列满足:
1、L(i)<=L(2i)且L(i)<=L(2i+1) 或
2、L(i)>=L(2i)且L(i)>=L(2i+1) (1<=i<=n/2)
满足第一种情况的称为小根堆(小顶堆,即最小的元素在根结点);
满足第二种情况的称为大根堆(大顶堆,即最大的元素在根结点)
实现步骤:
1、构造堆;
2、得到堆顶元素,这个值就是最大值;
3、交换堆顶元素和数组中的最后一个元素,此时所有元素中的最大元素已经被放到合适的位置
4、对堆进行调整,重新让除了最后一个元素的的剩余元素中的最大值放到堆顶;
5、重复2-4这个步骤,直到堆中剩一个元素为止
api设计:
实现代码
package com.yyy;public class HeapSort<T extends Comparable<T>> {//判断heap堆中索引i处的元素是否小于索引j处的元素private static boolean less(Comparable[] heap, int i, int j) {return heap[i].compareTo(heap[j])<0;}//交换heap堆中i索引和j索引处的值private static void exch(Comparable[] heap, int i, int j) {Comparable tmp = heap[i];heap[i] = heap[j];heap[j] = tmp;}//根据原数组source,构造出堆heapprivate static void createHeap(Comparable[] source, Comparable[] heap) {//把source中的元素拷贝到heap中,heap中的元素就形成一个无序的堆System.arraycopy(source,0,heap,1,source.length);//对堆中的元素做下沉调整(从长度的一半处开始,往索引1处扫描)for (int i = (heap.length)/2;i>0;i--){sink(heap,i,heap.length-1);}}//对source数组中的数据从小到大排序public static void sort(Comparable[] source) {//构建堆Comparable[] heap = new Comparable[source.length+1];createHeap(source,heap);//定义一个变量,记录未排序的元素中最大的索引int N = heap.length-1;//通过循环,交换1索引处的元素和排序的元素中最大的索引处的元素while(N!=1){//交换元素exch(heap,1,N);//排序交换后最大元素所在的索引,让它不要参与堆的下沉调整N--;//需要对索引1处的元素进行对的下沉调整sink(heap,1, N);}//把heap中的数据复制到原数组source中System.arraycopy(heap,1,source,0,source.length);}//在heap堆中,对target处的元素做下沉,范围是0~rangeprivate static void sink(Comparable[] heap, int target, int range){while(2*target<=range){//1.找出当前结点的较大的子结点int max;if (2*target+1<=range){if (less(heap,2*target,2*target+1)){max = 2*target+1;}else{max = 2*target;}}else{max = 2*target;}//2.比较当前结点的值和较大子结点的值if (!less(heap,target,max)){break;}exch(heap,target,max);target = max;}}
}
测试代码:
public static void main(String[] args) {//待排序数组String[] arr = {"S","O","R","T","E","X","A","M","P","L","E"};//通过HeapSort对数组中的元素进行排序HeapSort.sort(arr);//打印排序后数组中的元素System.out.println(Arrays.toString(arr));}
堆排序(小根堆)的简单实现(java)相关推荐
- 堆排序小根堆 大根堆 迭代 递归 总结 完整代码
http://blog.csdn.net/morewindows/article/details/6709644/ 1.堆基础 堆:完全二叉树或者是近似完全二叉树 大根堆:每个结点的值都大于或等于其 ...
- 堆排序--小根堆的建立与调整
网上关于小根堆(堆排序)的博客不是很多,有些代码还不全,这里找到一个适合初学者的代码分享给大家. 建议看下面代码前先把堆排序的图示方法看一遍,结合代码和书本示例看的话很容易懂 原作者在他的博客里已经写 ...
- java 小根堆 排序_堆排序(java实现)
堆排序就是用大根堆或者小根堆的节点都比左孩子 右孩子大(小)的特性 来构建有序序列. 名词解释: 大根堆:所有节点(n)都比他的左孩子(2n+1)与右孩子(2n+2)大的完全二叉树. 小根堆:所有节 ...
- 堆排序-以小根堆为例
文章目录 前言 一.什么是堆 二.堆排序过程 1.创建堆 2.堆排序 总结 前言 刷力扣题,遇到堆排序,考研完后就没接触数据结构,忘的差不多了,现在重现拾起来. 一.什么是堆 堆,这个词很形象,谷堆. ...
- 堆排序(大根堆与小根堆)
(1)是什么? 是一种适用于关键字较多的情况下的排序算法,例如在十亿个数中选出前1000个最大值或者最小值 如果在传统的排序算法中(例如冒泡,插入等),我们习惯把目标数据整体进行一次排序,再截取出前1 ...
- Java实现的小根堆
文章目录 1.二叉堆 2.一个例子 2.1 生成完全二叉树: 2.2.调整为小根堆 2.3.插入元素 2.4.取出堆顶元素 2.5.Java代码 3.画图工具 1.二叉堆 首先参考了一下→\right ...
- 浅谈大根堆,小根堆,以及堆排序(python)实现
既然要说堆排序,那么必然要说说什么是大根堆,小根堆了. 大根堆: 若根节点存在左右子节点,那么根节点的值大于或等于左右子节点的值. 小根堆: 若根节点存在左右子节点,那么根节点的值小于或等于左右子节点 ...
- 小根堆java_小根堆的Java实现
1. 堆 堆是完全二叉树的数组形式,由于堆没有指针指向,所以可以利用下标来模拟指向,假设 i 为父节点,那么 2i+1 为左孩子,2i+2 为右孩子.假设 i 为当前节点,那么 (i - 1) / 2 ...
- 数据结构与算法(二):堆,大根堆,小根堆,堆排序,比较器详解
堆 什么是堆? 堆 是一棵 完全二叉树:即使它不是满二叉树,也是正在从左往右变满的过程中. 1)堆结构就是用数组实现的完全二叉树结构 2)完全二叉树中,如果每棵子树的 最大值都在顶部,是 大根堆 3) ...
最新文章
- python中id函数的用法_用id函数做几个测试
- 基于c++11新标准开发一个支持多线程高并发的网络库
- 高一计算机应用选择题,职业中学 高一《计算机应用基础》期末考试题
- an7062个引脚工作电压_马兰士PM711AV功放电路原理分析
- Pandas入门教程(一)
- 微信小程序——诉讼费计算
- 个人微信公众号做外卖优惠券怎么弄?
- Unity-拓展篇-数字字体制作
- 感知机不能表示“异或”
- [翻译]《Programming - Principles and Practice Using C++, Second Edition》- Chapter 1
- volatile busy wating
- oracle灾备同步_浅析Oracle数据库的三种灾备技术
- 【数据挖掘】《数据分析与数据挖掘》--天津大学公开课
- Python自制恶搞virus
- [附源码]计算机毕业设计JAVA企业员工管理系统
- LC并联谐振电路的原理
- 【高项备考】范围管理,过程域、知识点、案例学习
- 蔚来汽车Java实习面经总结(来源:牛客与看准)
- phpnow切换php,PHPNOW如何升级PHP
- 信息系统项目管理师---第七章项目成本管理历年考题
热门文章
- 用inno Setup做应用程序安装包的示例脚本 .iss文件
- 2021-10-22 KiKi定义电子日历类
- Linux在加载模块时报insmod: error inserting xxx.ko -1 File exists这个错
- 泛型中的类型擦除和桥方法
- java母子年龄计算,小明12岁了,妈妈的年龄比小明大20岁,请问几年后妈妈的年龄是小明的两倍。
- E6-2019级航类第6次正式上机
- Echarts使用map3D+visualMap 实现地图下钻,区域高亮状态下变高
- [转] 研究云计算与海量数据处理方向建议看的论文列表
- 第六周 Java语法总结_设计原则_工厂模式_单例模式_代理模式(静态代理_动态代理)_递归_IO流_网络编程(UDP_TCP)_反射_数据库
- Unicode blocks 统计