Java实现堆排序算法
来源:互联网 发布:金元证券交易软件下载 编辑:程序博客网 时间:2024/05/21 09:17
堆是一种重要的数据结构,为一棵完全二叉树, 底层如果用数组存储数据的话,假设某个元素为序号为i(Java数组从0开始,i为0到n-1),如果它有左子树,那么左子树的位置是2i+1,如果有右子树,右子树的位置是2i+2。分为最大堆和最小堆,最大堆的任意子树根节点不小于任意子结点,最小堆的根节点不大于任意子结点。所谓堆排序就是利用堆这种数据结构来对数组排序,我们使用的是最大堆。处理的思想和冒泡排序,选择排序非常的类似,一层层封顶,只是最大元素的选取使用了最大堆。最大堆的最大元素一定在第0位置,构建好堆之后,交换0位置元素与顶即可。堆排序为原位排序(空间小), 且最坏运行时间是O(nlgn),是渐进最优的比较排序算法。
/** * 堆排序算法 */package sort;import java.util.Arrays;/** * @author 16026 * */public class HeapSort { // 建初始堆(小顶堆) public static void iniHeap(int[] array, int low, int high) { int i = low; // 子树的根节点 int j = 2 * i + 1; // j为i节点的左孩子 int temp = array[i]; while (j < high) { // 沿较小值孩子节点向下筛选 if (j < high - 1 && array[j] > array[j + 1]) { j++; // j为左右孩子的较小者 } if (temp > array[j]) { // 若父母节点值较大 array[i] = array[j]; // 孩子节点中的较小值上移 i = j; j = 2 * i + 1; } else { j = high + 1; // 退出循环 } } array[i] = temp; // 当前子树的原根值调整后的位置 } public static void heapSort(int[] array) { int len = array.length; int temp; for (int i = len / 2 - 1; i >= 0; i--) { // 创建堆 iniHeap(array, i, len); } for (int i = len - 1; i > 0; i--) {// 每趟将最小关键字值交换到后面,再调整成堆 temp = array[0]; array[0] = array[i]; array[i] = temp; iniHeap(array, 0, i); } } public static void main(String[] args) { int[] array = { 58, 69, 45, 25, 69, 48, 29, 65, 47 }; heapSort(array); System.out.println(Arrays.toString(array)); }}
运行结果是:
0 0
- 堆排序算法-java实现
- Java实现堆排序算法
- Java实现堆排序算法
- 堆排序算法java实现
- 堆排序算法--Java实现
- 堆排序算法java实现
- Java实现排序算法之堆排序
- java实现排序算法之堆排序
- Java实现排序算法2:堆排序
- java实现简单排序算法:堆排序
- 排序算法之堆排序java实现
- 排序算法之堆排序 Java 实现
- 堆排序算法(java实现)
- 堆排序算法的java实现
- 堆排序算法原理及JAVA实现
- 堆排序算法(C & Java 实现)
- 算法导论堆排序Java实现
- 《算法导论的Java实现》 堆排序
- Java相关知识普及
- TCP/IP系列——长连接与短连接的区别
- Bootstrap 环境安装
- 安卓开发之——AndroidSDK环境配置
- 二分查找法(递归和非递归实现)
- Java实现堆排序算法
- 进程终止分析之一
- VQA数据集及评价方法介绍
- LintCode | 408. 二进制求和
- 理解jvm类加载机制(双亲委派模型)
- Android自动打包发包 利用Jenkins
- s3c2451_gpio函数
- 李白打酒(DFS小例子)
- 欢迎使用CSDN-markdown编辑器