堆排序算法(java版)
来源:互联网 发布:网络大电影演员演出费 编辑:程序博客网 时间:2024/06/03 13:53
package com.duobang.headSort;import java.util.Arrays;import java.util.Random;public class MyHeapSort { public static void main(String[] args) { //随机产生count个元素的数组 Random rd = new Random(); int count = 10; int[] a = new int[count]; for (int i = 0; i < count; i++) { a[i] = rd.nextInt(count); } System.out.println("初始数组:" + Arrays.toString(a)); heapSort(a); System.out.println("排序后数组:" + Arrays.toString(a)); } //堆排序 private static void heapSort(int[] a) { //建立大根堆 buildMaxHeap(a); //排序:将大根堆中最大的元素放在最后,再次调节大根堆. for (int i = a.length - 1; i > 0 ; i--) { //交换头尾元素 swap(a,0,i); //调整大根堆 adjustDownToUp(a,0,i); } //调整会出现第一个元素比第二个元素大的问题,所以交换 if (a[0] > a[1]) { swap(a,0,1); } } //将root为根节点的元素调整为大根堆 private static void adjustDownToUp(int[] a, int root, int last) { int tmp = a[root]; //调整大根堆 for (int i = root * 2 + 1; i < last - 1; i = i * 2 + 1) { //取root的左右孩子中最大的一个 if (i < last && a[i] < a[i+1]) { i++; } //最大的孩子与根节点比较 if (tmp > a[i]) { break; }else{ a[root] = a[i];//将大的孩子放在根节点的位子 root = i;//根节点变为当前大的孩子的位置 } } //将根节点放在root的位置 a[root] = tmp; } //交换下标为i和i2两个元素的位置 private static void swap(int[] a, int i, int i2) { a[i] = a[i] ^ a[i2]; a[i2] = a[i] ^ a[i2]; a[i] = a[i] ^ a[i2]; } //建立大根堆 private static void buildMaxHeap(int[] a) { int len = a.length; //从最后一个节点开始调整大根堆 for (int i = (len - 1 - 1)/2; i >= 0; i--) { //将父节点是i的这棵树调节成一棵大根堆 adjustDownToUp(a,i,len); } }}
阅读全文
0 0
- 堆排序算法(java版)
- 排序算法之堆排序Java版
- Java堆排序算法
- Java 堆排序算法
- Java堆排序算法
- Java排序算法 堆排序
- Java排序算法:堆排序
- java排序算法 堆排序
- Java排序算法 堆排序
- 堆排序算法-java实现
- Java实现堆排序算法
- Java实现堆排序算法
- 堆排序算法java实现
- java算法之堆排序
- 堆排序算法--Java实现
- 堆排序算法java实现
- Java排序算法(三):堆排序
- java排序算法之堆排序
- 一个强悍而优美的Android视频播放器
- Android实现帧动画
- git将项目代码上传到github
- jsp的工作原理
- Action View
- 堆排序算法(java版)
- js中如何快速获取数组中的最大值最小值
- js数组合并concat()和Array.prototype.push.apply()的性能分析
- 美柚与MaxCompute数据同步架构说明
- QT 怎样添加编译选项
- 操作系统(一)
- java 基础5
- Java Web项目启动执行顺序
- [Linux]ubuntu下共享文件夹密码设置和重置-smbpasswd -a user