Java 堆排序(大根堆及小根堆)
整理网上的最大堆及最小堆代码
public abstract class Sorter {public abstract void sort(int[] array);
}
public class HeapSorter extends Sorter {@Overridepublic void sort(int[] array) {heapSort(array);}/*** 堆排序方法* 基于大根堆实现* @param array*/private void heapSort(int[] array) {Integer tmp;//暂存交换元素buildHeap(array);//执行初始建堆,并调整for (int i=0;i<array.length;i++){// 交换堆顶元素array[0]和堆中最后一个元素array[array.length-1-i]tmp=array[0];array[0]=array[array.length-i-1];array[array.length-i-1]=tmp;// 每次交换堆顶元素和堆中最后一个元素之后,都要对堆进行调整adjustHeap(array,0,array.length-i-1);}}/*** <p>* 调整堆的方法* @param i 待调整结点的索引* @param m 待调整堆的结点的数量(即:排除叶子结点)*/private void adjustHeap(int[] array, int i, int m) {Integer tmp = array[i]; // 当前待调整的结点int s = 2 * i + 1; // 当前待调整结点的左孩子结点的索引(s+1为当前调整结点的右孩子结点的索引)while (s < m) {if (s + 1 < m && array[s] < array[s + 1]) { // 如果右孩子大于左孩子(找到比当前待调整结点大的孩子结点)s=s+1;}if (array[i]<array[s]){array[i]=array[s];// 孩子结点大于当前待调整结点,将孩子结点放到当前待调整结点的位置上i=s;// 重新设置待调整的下一个结点的索引s=2*i+1;}else{// 如果当前待调整结点大于它的左右孩子,则不需要调整,直接退出break;}array[i]=tmp;// 当前待调整的结点放到比其大的孩子结点位置上}}/*** 建堆方法* 并调整0-array.length/2个节点,保持堆的性质* @param array*/private void buildHeap(int[] array) {// 求出当前堆中最后一个存在孩子结点的索引int pos=(array.length-1)/2;// 从该结点结点开始,执行建堆操作for (int i=pos;i>=0;i--){adjustHeap(array,i,array.length);// 在建堆过程中,及时调整堆中索引为i的结点}}/*** 最小堆* @param a* @param n*///构建最小堆public static void MakeMinHeap(int a[], int n){for(int i=(n-1)/2 ; i>=0 ; i--){MinHeapFixdown(a,i,n);}}//从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2public static void MinHeapFixdown(int a[],int i,int n){int j = 2*i+1; //子节点int temp = 0;while(j<n){//在左右子节点中寻找最小的if(j+1<n && a[j+1]<a[j]){j++;}if(a[i] <= a[j])break;//较大节点下移temp = a[i];a[i] = a[j];a[j] = temp;i = j;j = 2*i+1;}}public static void MinHeap_Sort(int a[],int n){int temp = 0;MakeMinHeap(a,n);for(int i=n-1;i>0;i--){temp = a[0];a[0] = a[i];a[i] = temp;MinHeapFixdown(a,0,i);}}public static void main(String[] args) {int array[]={1,6,9,45,65,12,3,4,578,78,5,6,13,458,12,456,789,123};HeapSorter heapSorter=new HeapSorter();heapSorter.heapSort(array);
// heapSorter.MinHeap_Sort(array,array.length);for (int i:array){System.out.print(i+" ");}System.out.println(" ");}
}
Java 堆排序(大根堆及小根堆)相关推荐
- C语言实现选择排序——堆排序(大根堆、小根堆)
C语言实现堆排序 文章目录 C语言实现堆排序 大根堆排序算法 1.交换操作 2.对结点进行调整为大根堆 3.建立大根堆 4.大根堆排序算法实现 小根堆排序算法 1.交换操作 2.对结点进行调整为小根堆 ...
- 浅谈大根堆,小根堆,以及堆排序(python)实现
既然要说堆排序,那么必然要说说什么是大根堆,小根堆了. 大根堆: 若根节点存在左右子节点,那么根节点的值大于或等于左右子节点的值. 小根堆: 若根节点存在左右子节点,那么根节点的值小于或等于左右子节点 ...
- 大根堆和小根堆的区别
大根堆和小根堆的区别 文章转自:https://blog.csdn.net/weixin_37197708/article/details/79546535 堆的概念 堆实际上是一棵完全二叉树,其任何 ...
- 大根堆与小根堆的理解,如何手写一个堆,以及什么时候用自己手写的堆,什么时候用语言提供堆的api,(二者的区别)
大根堆与小根堆的理解,如何手写一个堆,以及什么时候用自己手写的堆,什么时候用语言提供堆的api,(二者的区别) 定义 Heap是一种数据结构具有以下的特点: 1)完全二叉树: 2)heap中存储的值是 ...
- 堆(Heap)大根堆、小根堆
目录 堆(Heap)大根堆.小根堆 1.堆的存储: 2.堆的操作:insert 3.堆的操作:Removemax 4.堆的操作:buildHeap 堆化数组 5.堆排序 堆(Heap)大根堆.小根堆 ...
- 堆(大根堆、小根堆)
完全二叉堆 堆又可称之为完全二叉堆.这是一个逻辑上基于完全二叉树.物理上一般基于线性数据结构(如数组.向量.链表等)的一种数据结构. 完全二叉树的存储结构 学习过完全二叉树的同学们都应该了解,完全二叉 ...
- 堆结构 - 大根堆、小根堆
在开发语言中,heap在使用层次的名字叫PriorityQueue(优先级队列),PriorityQueue数据结构的名字就叫做堆,底层就是用堆结构实现的. 完全二叉树 空树也算是完全二叉树 每一层都 ...
- 小根堆java_小根堆的Java实现
1. 堆 堆是完全二叉树的数组形式,由于堆没有指针指向,所以可以利用下标来模拟指向,假设 i 为父节点,那么 2i+1 为左孩子,2i+2 为右孩子.假设 i 为当前节点,那么 (i - 1) / 2 ...
- 堆排序【手写小根堆】
一.什么是堆呢? 堆是一个高效的优先级队列,我们可以把堆看做一棵完全二叉树的数组. 性质: 堆中某个结点的值总是不大于或不小于其父结点的值 堆总是一棵完全二叉树 根结点最大的堆叫做最大堆或大根堆,根结 ...
- 【数据结构】堆,大根堆,小根堆,优先队列 详解
目录 堆 1.堆的数组实现 2.小根堆 3.大根堆 4.优先队列 例题 1.SP348 EXPEDI - Expedition(有趣的贪心思路,优先队列) 2.合并果子 堆 要了解堆之前,请先了解树, ...
最新文章
- 使用 ZwUnmapViewOfSection 卸载并替换内存镜像
- 装配bean的三种方式
- boost::mp11::mp_min_element_q相关用法的测试程序
- 完整的连接器设计手册_Harwin连接器展示在深井探油应用中不受环境影响的价值...
- python特殊函数__str__、__repr__和__len__
- 九度oj题目1518:反转链表
- 诗与远方:无题(十四)
- python自动复制,Python数组自动相互复制
- 【Flink】Flink 实时超时统计-A发生B不发生事件统计-不发生事件
- HTTP协议——学习资料小结
- python类使用异步_异步Python类
- AutoCAD块属性提取
- Linux team多网卡绑定
- dell r720光盘启动项_Dell R720服务器安装操作系统
- Java开发月薪两万,需要达到怎样的技术水平?
- kali linux 虚拟机iso 下载,Kali Linux 2016.2发布提供虚拟机以及系统镜像下载
- 从运维角度聊下:如何维护一套 DevOps 系统
- 基于python的深度学习框架有_《用Python实现深度学习框架》上市
- MySQL数据库——MySQL查看存储过程
- php做网站步骤_新手如何用PHP开发一个完整的网站?