排序算法FOUR:堆排序HeapSort
/** *堆排序思路:O(nlogn) * 用最大堆,传入一个数组,先用数组建堆,维护堆的性质 * 再把第一个数与堆最后一个数调换,因为第一个数是最大的 * 把堆的大小减小一 * 再 在堆的大小上维护堆的性质 * 重复操作.. * * */ public class HeapSort { /** *静态变量存放堆的大小 */ private static int heapsize = 0 ; /** *堆排序主方法 * 构建最大堆,然后进行堆排序 * 堆排序是把最上面的最大的元素放在最下面,然后再维护上面最大堆的性质 */ public static void heapSort(int[] resouceArr) { //堆的大小 heapsize = resouceArr.length - 1 ; _buildMaxHeap(resouceArr); for( int i = resouceArr.length - 1 ; i >= 0 ; i--) { int temp = resouceArr[0] ; resouceArr[0] = resouceArr[i] ; resouceArr[i] = temp ; heapsize = heapsize - 1 ; _maxHeapify( resouceArr, 0 ); } } /** *构建最大堆 * 构建之后还不是有序的,但符合最大堆性质,上面的数一定大于下面的数 */ private static void _buildMaxHeap(int[] arr) { int length = arr.length - 1 ; //从倒数第二排开始维护最大堆性质 // 当heapsize为偶数时,heapsize要减一 // 当heapsize为奇数时,不变 if(length % 2 == 0) { length--; } for( int i = length / 2 ; i >= 0 ; i--) { _maxHeapify(arr , i ); } } /** *用于维护堆的性质 * 树形堆在postion的位置向下维护堆的性质,自postion向下满足最大堆的性质 */ private static void _maxHeapify(int[] arr,int postion) { //计算postion的左孩子和右孩子 postion = postion + 1 ; int l = postion * 2 - 1; int r = postion * 2 ; postion = postion - 1 ; int largest = maxNumInThreeNum(arr , postion , l , r); //如果不满足最大堆性质,则交换值,然后检查树形下方是否满足最大堆性质 if(largest <= heapsize) { if( largest != postion) { //交换最大值与父节点值 int temp = arr[postion] ; arr[postion] = arr[largest] ; arr[largest] = temp ; //如果子节点变动了,则重新构建已子节点为根的最大堆 _maxHeapify(arr , largest); } } } /** *比较数组中的三个数找出最大值 */ private static int maxNumInThreeNum(int[] arr ,int a, int b , int c) { int max = a ; //数组长度小于左孩子,最大值为本身 if(heapsize < b) { max = a ; } else if(heapsize >=b && heapsize < c) { if(arr[a] < arr[b]) { max = b ; } } else { if(arr[a] > arr[b]) { max = a ; } else { max = b ; } if(arr[max] < arr[c]) { max = c ; } } return max ; } }
排序算法FOUR:堆排序HeapSort的更多相关文章
- Java常见排序算法之堆排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 排序算法之堆排序(Heapsort)解析
一.堆排序的优缺点(pros and cons) (还是简单的说说这个,毕竟没有必要浪费时间去理解一个糟糕的的算法) 优点: 堆排序的效率与快排.归并相同,都达到了基于比较的排序算法效率的峰值(时间复 ...
- Java排序算法之堆排序
堆的概念: 堆是一种完全二叉树,非叶子结点 i 要满足key[i]>key[i+1]&&key[i]>key[i+2](最大堆) 或者 key[i]<key[i+1] ...
- 《排序算法》——堆排序(大顶堆,小顶堆,Java)
十大算法之堆排序: 堆的定义例如以下: n个元素的序列{k0,k1,...,ki,-,k(n-1)}当且仅当满足下关系时,称之为堆. " ki<=k2i,ki<=k2i+1;或k ...
- C++编程练习(13)----“排序算法 之 堆排序“
堆排序 堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆(也叫最大堆):或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆(也叫最小堆). 最小堆和最大堆如 ...
- 数据结构与算法之PHP排序算法(堆排序)
一.堆的定义 堆通常是一个可以被看做一棵树的数组对象,其任一非叶节点满足以下性质: 1)堆中某个节点的值总是不大于或不小于其父节点的值: 每个节点的值都大于或等于其左右子节点的值,称为大顶堆.即:ar ...
- 八大排序算法之七—堆排序(Heap Sort)
堆排序是一种树形选择排序,是对直接选择排序的有效改进. 基本思想: 堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素) ...
- 排序算法(2) 堆排序 C++实现
堆 1 数组对象 2 可以视为一棵完全二叉树 3 一个堆可以被看作一棵二叉树和一个数组,如下图所示: 4 下标计算(通常使用内联函数或者宏来定义下标操作): 已知某个结点的下标为i 其父节点下标:i/ ...
- Python 一网打尽<排序算法>之堆排序算法中的树
本文从树数据结构说到二叉堆数据结构,再使用二叉堆的有序性对无序数列排序. 1. 树 树是最基本的数据结构,可以用树映射现实世界中一对多的群体关系.如公司的组织结构.网页中标签之间的关系.操作系统中文件 ...
随机推荐
- 时间紧迫,写一些 NavigationController 一次性返回2级界面甚至更多级的界面
在NavigationController中,调用pushViewController可以将界面推到指定的界面,调用popToViewController可以返回上层界面,可是它的实现原理是什么? 好 ...
- FloatingActionButton
https://github.com/Clans/FloatingActionButton
- [置顶] 【玩转cocos2d-x之七】场景类CCScene和布景类CCLayer
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12708811 场景类CCScene和布景类CCLayer都是作为一个容器来使 ...
- [Heroku] How to pull, push changes
1. First you need to login heroku: heroku login 2. Then you need to download the code: heroku git:cl ...
- android判断当前应用程序处于前台还是后台
/** *判断当前应用程序处于前台还是后台 * * @param context * @return */ public static boolean ...
- MySQL使用hugepage
http://blog.csdn.net/dba_waterbin/article/details/9669929http://www.cnblogs.com/LMySQL/p/4689868.htm ...
- php中global和$GLOBALS[]的分析之一
PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖 这可能引起一些问题,有些人可能漫不经心的改变一个全局变量.PHP 中全局变量在函数 ...
- JavaScript中的各种宽高以及位置总结
JavaScript中的各种宽高以及位置总结 在javascript中操作dom节点让其运动的时候,常常会涉及到各种宽高以及位置坐标等概念,如果不能很好地理解这些属性所代表的意义,就不能理解js的运动 ...
- Android_AsyncTask_DownloadImg
layout.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...
- 排序并获取index的顺序
//排序并获取index的顺序:4,7,2,9-->9,7,4,2-->4,2,1,3 Array.prototype.getIndex=function(){ var orderLeng ...