堆排序
来源:互联网 发布:卓智网络是培训公司吗 编辑:程序博客网 时间:2024/06/05 02:35
记录下堆排序。。。。
堆排序的步骤:
1)根据给定的数组建立堆结构,维护堆的性质;
2)排序:每次将堆顶与最后一个元素(不算堆顶互换过来的)互换,再维护 第一个元素至最后一个元素 的堆性质,重新维护堆。。。依此循环
import java.util.Arrays;public class HeapMakeTest {public static void main(String[] args) {int[] num = {1,2,5,3,9,7,4,8};HeapMakeTest hmt = new HeapMakeTest();hmt.makeHeap(num,num.length);System.out.println(Arrays.toString(num));hmt.heapSort(num, num.length);System.out.println(Arrays.toString(num));}// 建立一个大顶堆,从最后一个元素的双亲节点开始public void makeHeap(int[] num,int length){for(int i=(length-1-1)/2;i>=0;i--)adjustHeap(num,i,length);}public void adjustHeap(int[] num, int k, int length){int temp = num[k]; // 记录父节点的值for(int i=2*k+1;i<length;i=2*i+1){ // i=2*i+1 不断的往孩子节点方向调整,因为父节点与孩子节点交换后,孩子树中可能不满足堆的性质if(i+1<length && num[i]<num[i+1])i++; // 找到左、右孩子节点中的最大值if(temp>=num[i])break; // 如果父节点大于孩子节点,不需要调整else{num[k]=num[i]; // 孩子节点赋值给父节点k = i; // 记录需要更新的节点位置}}num[k]=temp; // 更新上述k下标节点的值}// 堆排序public void heapSort(int[] num,int length){// 数组首部与数组尾部交换,即堆的顶挪到“相对”最后一位,(不算来自堆顶的元素),再将其余的数组元素重建堆,依此循环for(int i=0;i<length;i++){int tmp = num[0];num[0]=num[length-1-i];num[length-1-i]=tmp;makeHeap(num,length-1-i);}}}
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- Eclipse背景颜色修改:
- ncverilog和irun的区别
- JDBC对数据库的增删改查
- poj3159Candies_差分约束系统解决_转换(spfa算法)
- unix-文件i/o学习笔记
- 堆排序
- php连接mysql学习过程中遇到的各种问题总结
- JSP表单的select标签的用法
- Centos6.5 64位安装lvs
- SQL用法之单表查询
- NYOJ-845无主之地1
- ffmpeg源码简析(五)编码——avformat_alloc_output_context2(),avcodec_encode_video2()
- 使用Node.js搭建微信支付后台(二)
- 小白训练营结业作业