数据结构:堆排序一(heap sort)
普通队列: 先进先出, 后进后出
priority queue(优先队列): 出队顺序与入队顺序无关; 和优先级相关
二叉堆
叶子节点: 一棵树当中没有子结点(即度为0)的结点称为叶子节点,简称“叶子”
从数组下标1开始存储, 最后一个非叶子节点的索引: count/2
从数组下标0开始存储,最后一个非叶子节点的索引: (count-1)/2
数组实现二叉堆
public class MaxHeap {private int count;private int capacaity;private int[] data;public MaxHeap(int capacity){data = new int[capacity+1];this.capacaity = capacity;}public int size(){return count;}boolean isEmpty(){return count == 0 ;}public void insert(int item){if(count+1 > capacaity)return;// 从数组下标为1的位置开始插入元素data[count+1] = item;count++;shiftUp(count);}// 取出最大的值public int extractMax(){if(count < 1)return -1;int ret = data[1];data[1] = data[count]; // 将最后一个元素放在第一个元素的位置上count--;shiftDown(1);return ret;}private void shiftDown(int k){while(2*k <= count){int j = 2*k; // 在此轮循环中,data[k]和data[j]交换位置// 判断是否有右孩子if(j+1<=count && data[j] < data[j+1]){j = j+1;}if(data[k] >= data[j]){break;}int temp = data[k];data[k] = data[j];data[j] = temp;k = j;}}private void shiftUp(int k){while(k > 1 && (data[k/2] < data[k])){int temp = data[k/2];data[k/2] = data[k];data[k] = temp;k = k/2; }}public void printMaxHeap(){for(int i=1; i<=count; i++){System.out.println("下标"+i+" ="+data[i]);}}public static void main(String[] args){MaxHeap maxHeap = new MaxHeap(100);for(int i=0; i<15; i++){maxHeap.insert(i);}System.out.println(maxHeap.size());maxHeap.printMaxHeap();System.out.println(maxHeap.extractMax());maxHeap.printMaxHeap();}
}
排序算法的稳定性
索引堆
package com.heap;/// 索引最大堆
public class IndexMaxHeap {private int count; // 元素个数private int capacaity; // 元素容量private int[] data; // 存储数据private int[] indexs; // 存储数据的索引public IndexMaxHeap(int capacity){data = new int[capacity+1];indexs = new int[capacity+1];this.capacaity = capacity;}public int size(){return count;}boolean isEmpty(){return count == 0 ;}// 传入的i对用户而言,是从0索引开始的public void insert(int i, int item){if(count+1 > capacaity)return;if(i+1 < 1 || i+1 > capacaity)return;// 从数组下标为1的位置开始插入元素data[i+1] = item;indexs[count+1] = i+1;count++;shiftUp(count);}public int extractMax(){if(count < 1)return -1;int ret = data[indexs[1]];indexs[1] = indexs[count]; count--;shiftDown(1);return ret;}private void shiftDown(int k){while(2*k <= count){int j = 2*k; // 在此轮循环中,data[k]和data[j]交换位置// 判断是否有右孩子if(j+1<=count && data[indexs[j]] < data[indexs[j+1]]){j = j+1;}if(data[indexs[k]] >= data[indexs[j]]){break;}int temp = indexs[k];indexs[k] = indexs[j];indexs[j] = temp;k = j;}}private void shiftUp(int k){while(k > 1 && (data[indexs[k/2]] < data[indexs[k]])){int temp = indexs[k/2];indexs[k/2] = indexs[k];indexs[k] = temp;k = k/2; }}public void printMaxHeap(){System.out.println("===");for(int i=1; i<=count; i++){System.out.println("下标"+i+" ="+data[i]);}}public void printMaxIndexHeap(){System.out.println("===");for(int i=1; i<=count; i++){System.out.println("下标"+i+" ="+data[indexs[i]]);}}public static void main(String[] args){IndexMaxHeap maxHeap = new IndexMaxHeap(100);for(int i=0; i<15; i++){maxHeap.insert(i, (int)(Math.random() * 100));}System.out.println(maxHeap.size());maxHeap.printMaxIndexHeap();maxHeap.printMaxHeap();int max = maxHeap.extractMax();System.out.println("max="+max);maxHeap.printMaxIndexHeap();
// System.out.println(maxHeap.extractMax());
// maxHeap.printMaxIndexHeap();
//
//
// int[] arr = {5,4,10,2,12,7,9};
// maxHeap.printMaxHeap();}
}
数据结构:堆排序一(heap sort)相关推荐
- java heap排序_关于Java排序算法-堆排序(Heap Sort)
堆排序是利用堆的特性进行排序的过程. 堆排序:输出堆顶的最小(大)值后,使剩余的n-1个元素序列重新再建成堆,则可得到原序列的次小(大)值.反复进行可得到一个有序序列,整个过程称为堆排序. 堆排序分为 ...
- php+堆排序算法,PHP实现排序堆排序(Heap Sort)算法
算法引进: 在这里我直接引用<大话数据结构>里面的开头: 在前面讲到 简单选择排序 ,它在待排序的 n 个记录中选择一个最小的记录需要比较 n - 1 次,本来这也可以理解,查找第一个数据 ...
- 堆排序(heap sort)
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好的,平均时间复杂度为O(nlogn),它也不是不稳定排序. 1.堆的介绍 堆是具有以下性质的完全二叉树:每个结点的值 ...
- Python入门篇-数据结构堆排序Heap Sort
Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树每个非叶子结点都要大于或者等于其左右孩子结点的 ...
- 经典排序算法 - 堆排序Heap sort
经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 ...
- PAT甲级1098 Insertion or Heap Sort:[C++题解]堆排序和插入排序
文章目录 题目分析 题目链接 题目分析 分析 插入排序的特点:前半部分有序,后半部分保持原序. 堆排序的特点: 后半部分有序,前半部分无序. 本题的bug在于,答案是唯一的,即不是插入排序就是堆排序, ...
- C语言实现heap sort堆排序的算法(附完整源码)
C语言实现heap sort堆排序的算法 C语言实现heap sort堆排序的算法完整源码(定义,实现,main函数测试) C语言实现heap sort堆排序的算法完整源码(定义,实现,main函数测 ...
- C++Heap Sort堆排序的实现算法(附完整源码)
C++Heap Sort堆排序的实现算法 C++Heap Sort堆排序的实现算法完整源码(定义,实现,main函数测试) C++Heap Sort堆排序的实现算法完整源码(定义,实现,main函数测 ...
- C语言堆排序Heap Sort算法(附完整源码)
堆排序Heap Sort算法 堆排序Heap Sort算法的完整源码(定义,实现,main函数测试) 堆排序Heap Sort算法的完整源码(定义,实现,main函数测试) #include < ...
- 数据结构与算法(C++)– 堆排(Heap Sort)
堆排(Heap Sort) 1.概念 完全二叉树特点: 对于完全二叉树中任一点 i: 左孩子的位置为: 2i 右孩子的位置为:2i+1 父节点位置为:i/2 向下取整 最小二叉堆:根节点的值小于子树的 ...
最新文章
- viso图片转eps文件 AND pdf转eps文件
- 2017 年全国大学生电子设计竞赛试题——四旋翼自主飞行器探测跟踪系统(C 题)【本科组】1
- windows查看usb信息命令_【VPS】Linux VPS查看系统信息命令大全
- 发展之道:简单与专注
- string转int的方法_Spark——scala 实用小方法
- ios ffmpeg+libx264
- 深入解读Linux进程调度系列(1)——调度的初始化
- 在WPF中自定义控件(1)
- 利用ZEBAR 软件生成ZPL 代码
- 常见搜索引擎蜘蛛大全
- 【Microsoft Azure 的1024种玩法】七.Azure云端搭建部署属于自己的维基百科
- php上传504,nginx+php设置大文件请求上传(502及504问题处理)
- 惠普电脑调节电脑亮度
- Lodash的两种安装方式(npm安装/CDN)以及简单使用
- 手把手教你用JAVA调用Websocket实现“声音转换”功能(变声)标贝科技
- 初夏小谈:结构体内存对齐详解
- 5G基带芯片之战现状:一二三分别对应联发科华为高通
- 常见的树形结构(一)
- 搭建BWAPP靶场(详细过程)
- Background Matting视频抠图