堆排序是一种树形选择排序方法,它的特点是:在排序过程中,将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)相关推荐

  1. 堆排序小根堆 大根堆 迭代 递归 总结 完整代码

    http://blog.csdn.net/morewindows/article/details/6709644/ 1.堆基础 堆:完全二叉树或者是近似完全二叉树  大根堆:每个结点的值都大于或等于其 ...

  2. 堆排序--小根堆的建立与调整

    网上关于小根堆(堆排序)的博客不是很多,有些代码还不全,这里找到一个适合初学者的代码分享给大家. 建议看下面代码前先把堆排序的图示方法看一遍,结合代码和书本示例看的话很容易懂 原作者在他的博客里已经写 ...

  3. java 小根堆 排序_堆排序(java实现)

    堆排序就是用大根堆或者小根堆的节点都比左孩子 右孩子大(小)的特性  来构建有序序列. 名词解释: 大根堆:所有节点(n)都比他的左孩子(2n+1)与右孩子(2n+2)大的完全二叉树. 小根堆:所有节 ...

  4. 堆排序-以小根堆为例

    文章目录 前言 一.什么是堆 二.堆排序过程 1.创建堆 2.堆排序 总结 前言 刷力扣题,遇到堆排序,考研完后就没接触数据结构,忘的差不多了,现在重现拾起来. 一.什么是堆 堆,这个词很形象,谷堆. ...

  5. 堆排序(大根堆与小根堆)

    (1)是什么? 是一种适用于关键字较多的情况下的排序算法,例如在十亿个数中选出前1000个最大值或者最小值 如果在传统的排序算法中(例如冒泡,插入等),我们习惯把目标数据整体进行一次排序,再截取出前1 ...

  6. Java实现的小根堆

    文章目录 1.二叉堆 2.一个例子 2.1 生成完全二叉树: 2.2.调整为小根堆 2.3.插入元素 2.4.取出堆顶元素 2.5.Java代码 3.画图工具 1.二叉堆 首先参考了一下→\right ...

  7. 浅谈大根堆,小根堆,以及堆排序(python)实现

    既然要说堆排序,那么必然要说说什么是大根堆,小根堆了. 大根堆: 若根节点存在左右子节点,那么根节点的值大于或等于左右子节点的值. 小根堆: 若根节点存在左右子节点,那么根节点的值小于或等于左右子节点 ...

  8. 小根堆java_小根堆的Java实现

    1. 堆 堆是完全二叉树的数组形式,由于堆没有指针指向,所以可以利用下标来模拟指向,假设 i 为父节点,那么 2i+1 为左孩子,2i+2 为右孩子.假设 i 为当前节点,那么 (i - 1) / 2 ...

  9. 数据结构与算法(二):堆,大根堆,小根堆,堆排序,比较器详解

    堆 什么是堆? 堆 是一棵 完全二叉树:即使它不是满二叉树,也是正在从左往右变满的过程中. 1)堆结构就是用数组实现的完全二叉树结构 2)完全二叉树中,如果每棵子树的 最大值都在顶部,是 大根堆 3) ...

最新文章

  1. python中id函数的用法_用id函数做几个测试
  2. 基于c++11新标准开发一个支持多线程高并发的网络库
  3. 高一计算机应用选择题,职业中学 高一《计算机应用基础》期末考试题
  4. an7062个引脚工作电压_马兰士PM711AV功放电路原理分析
  5. Pandas入门教程(一)
  6. 微信小程序——诉讼费计算
  7. 个人微信公众号做外卖优惠券怎么弄?
  8. Unity-拓展篇-数字字体制作
  9. 感知机不能表示“异或”
  10. [翻译]《Programming - Principles and Practice Using C++, Second Edition》- Chapter 1
  11. volatile busy wating
  12. oracle灾备同步_浅析Oracle数据库的三种灾备技术
  13. 【数据挖掘】《数据分析与数据挖掘》--天津大学公开课
  14. Python自制恶搞virus
  15. [附源码]计算机毕业设计JAVA企业员工管理系统
  16. LC并联谐振电路的原理
  17. 【高项备考】范围管理,过程域、知识点、案例学习
  18. 蔚来汽车Java实习面经总结(来源:牛客与看准)
  19. phpnow切换php,PHPNOW如何升级PHP
  20. 信息系统项目管理师---第七章项目成本管理历年考题

热门文章

  1. 用inno Setup做应用程序安装包的示例脚本 .iss文件
  2. 2021-10-22 KiKi定义电子日历类
  3. Linux在加载模块时报insmod: error inserting xxx.ko -1 File exists这个错
  4. 泛型中的类型擦除和桥方法
  5. java母子年龄计算,小明12岁了,妈妈的年龄比小明大20岁,请问几年后妈妈的年龄是小明的两倍。
  6. E6-2019级航类第6次正式上机
  7. Echarts使用map3D+visualMap 实现地图下钻,区域高亮状态下变高
  8. [转] 研究云计算与海量数据处理方向建议看的论文列表
  9. 第六周 Java语法总结_设计原则_工厂模式_单例模式_代理模式(静态代理_动态代理)_递归_IO流_网络编程(UDP_TCP)_反射_数据库
  10. Unicode blocks 统计