经典排序算法——堆排序(基本算法之一)
来源:互联网 发布:g92内螺纹编程实例解释 编辑:程序博客网 时间:2024/06/06 05:07
因为最近搞堆排序发现,网上有一些代码的思想没错,,但是角标的处理上 有一些瑕疵。。。。所以就想自己写一个
堆排序主要的思想就是将角标看作是一个完全二叉树,这里不懂的话建议去补一补数据结构
所以树的跟节点为0,
左节点是 2i+1
右节点是 2i+2
然后利用递归的思想,将这棵完全二叉树每一个小分支上最大的一个节点浮上去,最后,保证根节点是现有数据里面最大的那个数字,再将这个节点放在未确定的前一半数组中的最后一个,然后一次一次的迭代加递归,,
数据量较少的时候建议不要用,,跟其他方法差不了多少,,,,
代码如下
public void heapSort(int[] arg){
if(arg.length<=1){ return;}
int size = arg.length
buildHeap(arg, size);
for(int i = size - 1 ; i>=1 ; i--){ // 从1开始,是因为0角标的数字永远都是我们经过调整之后 最大的那个
swap(arg, 0, i); // 这样就可以把每次未调整的数据中最大的数组挪到被调整的这一批数字中的最后一个
adjustHeap(arg, 0, i); //因为每次都是将树根放到后面,所以这里一直是0
}
private void buildHeap(int[] arg, int size){
int startRoot = (size-1)/2
for(int i = startRoot ; 1>=0 ; i--){
adjustHeap(arg, i , size);
}
}
private void adjustHeap(int[] arg, int index, int size){
int max = index;
int left = index*2+1;
int right = index*2+2;
if(left<size && arg[left] > arg[max]){
max = left;
}
if(right<size && arg[right] > arg[max]){
max = right;
}
if(max!=index){
swap(arg, index, max);
adjustHeap(arg, max, size); //这里因为不知道是左子树上去了 还是右子树上去了,所以就用max记录
}
}
private void swap(int[] arg, int index, int index2){
int temp = arg[index];
arg[index] = arg[index2];
arg[index2] = temp;
}
- 经典排序算法——堆排序(基本算法之一)
- 经典排序算法——堆排序
- 基本排序算法(4)——堆排序
- 经典算法——堆排序
- 经典算法学习——堆排序
- 【经典算法】堆排序
- 经典算法:堆排序
- 堆排序-基本算法
- 基本排序算法--堆排序
- 经典排序算法之——堆排序
- 排序算法—堆排序
- 经典排序算法(7)——堆排序算法详解
- 【经典排序算法】选择排序、堆排序
- 【经典】【排序】快速排序算法、堆排序
- [算法系列之一]堆排序
- [算法系列之一]堆排序
- 算法学习之一:堆排序
- 经典排序算法----堆与堆排序(不稳定)
- redis-cluster集群
- 守护进程
- 欢迎使用CSDN-markdown编辑器
- MySQL基本操作
- 微信小程序开发前的准备工作
- 经典排序算法——堆排序(基本算法之一)
- hdu 5974 A Simple Math Problem
- Python的并发编程
- vue知识浅析
- JavaWeb学习总结(一)——JavaWeb开发入门
- mob第三方登录
- linux消息队列
- 在开发SSH项目时,使用Log4j配置监听日志,出现的异常处理方法
- Error (169008): Can't turn on open-drain option for differential I/O pin