java排序之堆排序
2016-04-29 18:52
337 查看
这篇文章的代码叙述的是堆排序的构成,堆排序我认为最重要的就是理解,代码,真的简单的,这里我仅谈谈我的思路,将一个数组想想成一棵树,然后首先构建一个大根堆,然后将这个大根堆的根借点和最后一个交互位置,然后后面不断的重复交换,构建大根堆的过程,然后就完成排序了啊,其实,这个和我之前几篇说的差不多,这个堆排序是基于选择排序的,每次选出最大的一个,然后交换,这个方法最主要的就是将这些数据分开来选择,然后结合在一起了,而且每次构建堆也是一种排序,真的快。
代码:
代码:
package com.jk.heapsort; /** * 这个代码是堆排序的代码,我个人认为这个主要就是把这个代码想象成一个树,然后构造大根堆,然后不断和最后一个交换,就ok了,这个东西就需要自己去理解了。 */ import java.util.Arrays; public class Test { public static void main(String[] args) { int[] a = new int[] { 1, 9, 3, 6, 2, 8 }; heapSort(a, a.length); System.out.println(Arrays.toString(a)); } private static void heapSort(int[] a, int length) { int i, j, h, k; int t; for (i = length / 2; i >= 0; i--) {// 将a[0,n-1]建成大根堆 while (2 * i + 1 < length) {// 第i个节点有右子树 j = 2 * i + 1; if ((j + 1) < length) { if (a[j] < a[j + 1])// 左子树小于右子树,那么应该比较右子树 j++;// 序号加1,指向右字数 } if (a[i] < a[j]) {// 比较以i和j为序号的数据 t = a[i]; // 交换数据 a[i] = a[j]; a[j] = t; i = j; } else { break; } } } // 这里其实就是进行每次的交换,然后重复建堆的过程 for (i = length - 1; i > 0; i--) { t = a[0]; a[0] = a[i]; a[i] = t; k = 0; while (2 * k + 1 < i) { j = 2 * k + 1; if ((j + 1) < i) { if (a[j] < a[j + 1]) { j++; } } if (a[k] < a[j]) { t = a[k]; a[k] = a[j]; a[j] = t; k = j; } else { break; } } } } }
相关文章推荐
- 图片裁剪缩略处理小工具类
- Java使用poi操作cexel
- Spring MVC工程结构及配置整理
- Java常见问题-高亮
- YAML 技术研究
- Java打印整数的二进制表示(代码与解析)
- Java ClassLoader 深入理解
- Ehcache缓存结合Spring AOP实现接口数据缓存
- java 单例模式
- Java中extends和implements的区别
- 20145236 《Java程序设计》实验四实验报告
- ASM技术研究
- Java学习-20天
- Java将科学计数法数据转为字符串
- Java将科学计数法数据转为字符串
- Java将科学计数法数据转为字符串
- JDK 源码解析 —— ArrayBlockingQueue
- 正则表达式、Calendar类、SimpleDateFormat类、Date类、BigDecimal类、BigInteger类、System类、Random类、Math类(Java基础知识十四)
- 一键清理Eclipse版
- webuploader