堆排序算法的Java实现
2016-07-25 17:44
417 查看
/** * @author xhl * 堆排序(本代码是小顶堆的实现) * 参照《数据结构》(严蔚敏版),算法10.10、10.11伪代码实现。 * 思路:1.建堆:从一个无序序列建堆的过程就是一个反复“筛选”的过程。若将此序列看成是一个完全二叉树,则最后一个非终端结点是第n/2(n/2向下取整)个 * 元素,由此“筛选”只需从第n/2(n/2向下取整)个元素开始。 * 2.输出堆顶元素并重新建堆:假设输出堆顶元素之后,以堆中最后一个元素替代之,此时根结点的左、右子树均为堆,则仅需自上至下进行调整即可。我们称自 * 堆顶至叶子的调整过程为“筛选 ”。 */ public class HeapSort { /* 筛选:自上至叶子的“筛选”过程。s节点与左右节点比较,将最小值和s交换(每次比较两次),如果发生交换行为,则要对被交换的节点继续向下筛选 */ void HeapAdjust(int[] array, int s, int m) { int j = s * 2 + 1; if (j < m) { int tempindex = j; if (j + 1 < m && array[j] > array[j + 1]) tempindex = j + 1;// 找出左右节点最小的一个 if (array[tempindex] < array[s]) { int temp2 = 0; temp2 = array[s]; array[s] = array[tempindex]; array[tempindex] = temp2;// 用最小值和s处值交换 HeapAdjust(array, tempindex, m); } } } void heap_sort(int[] array) { /* * 建堆:把array建成小顶堆:从array.length/2-1(即最后一个非终端节点,另外在数组中计数从0开始, * 如果从1计数,最后一个非终端节点是array.length/2)。筛选,一直到根节点 */ for (int i = array.length / 2 - 1; i >= 0; i--) { HeapAdjust(array, i, array.length); } /* 输出头结点并重新调整堆:每输出一次根节点,将最后一个元素赋给根节点(相当于删除原根节点),再 * 自根节点向下筛选,筛选至倒数第二个元素 */ for (int i = 0; i < array.length; i++) { System.out.println(array[0]); array[0] = array[array.length - 1 - i]; HeapAdjust(array, 0, array.length - 1 - i); } } public static void main(String[] args) { // TODO Auto-generated method stub HeapSort o = new HeapSort(); int[] array = { 0, 4, 2, 5, 1, 8, 7, 9 }; o.heap_sort(array); } }
相关文章推荐
- 解决Mac_java.net_Local_host_name_unknown_error的方法
- Spring定时任务中cronExpression
- 客户端获取服务器数据中文乱码问题
- Java---设计模式(值对象)
- Java jdbc将sqlserver数据导出至mysql报错非法字符
- Java线程学习笔记(二)---多线程同步方法
- 《深入浅出 Java Concurrency》—并发容器 ConcurrentMap
- 69 个经典 Spring 面试题和答案
- Java IO 节点流 ByteArrayInput/OutputStream
- java冒泡排序
- eclipse 安装svn插件
- Eclipse找出所有中文字符方法(全球化开发方式)
- Java线程工作内存与主内存变量交换过程及volatile关键字理解
- spring事务
- 关于java注解使用的例子
- HashMap使用Comparator排序
- Ubuntu安装JDK1.8
- JAVA XML的解析与创建
- 跟我读Spring——Spring源码浅析(前序)
- eclipse svn插件 links方式