算法代码实现之堆排序,Java实现
来源:互联网 发布:网络巫师剧情介绍 编辑:程序博客网 时间:2024/05/16 17:33
封装成类:
package com.roc.algorithms.sort;/** * 堆排序 * a[0]不用,实际元素从角标1开始 * 父节点元素大于子节点元素 * 左子节点角标为2*k * 右子节点角标为2*k+1 * 父节点角标为k/2 * * @author roc */public class HeapSort { public static void sort(int[] a) { //s[0]不用,实际元素数量和最后一个元素的角标都为N int N = a.length - 1; //构造堆 //如果给两个已构造好的堆添加一个共同父节点, //将新添加的节点作一次下沉将构造一个新堆, //由于叶子节点都可看作一个构造好的堆,所以 //可以从最后一个非叶子节点开始下沉,直至 //根节点,最后一个非叶子节点是最后一个叶子 //节点的父节点,角标为N/2 for (int k = N / 2; k >= 1; k--) { sink(a, k, N); } //下沉排序 while (N > 1) { swap(a, 1, N--); //将大的放在数组后面,升序排序 sink(a, 1, N); } } //下沉(由上至下的堆有序化) private static void sink(int[] a, int k, int N) { while (true) { int i = 2 * k; if (i > N) { //保证该节点是非叶子节点 break; } if (i < N && a[i + 1] > a[i]) { //选择较大的子节点 i++; } if (a[k] >= a[i]) { //没下沉到底就构造好堆了 break; } swap(a, k, i); k = i; } } private static void swap(int[] a, int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; }}
测试:
int[] a = {-1, 9, 0, 6, 5, 8, 2, 1, 7, 4, 3};System.out.println(Arrays.toString(a));HeapSort.sort(a);System.out.println(Arrays.toString(a));
输出:
[-1, 9, 0, 6, 5, 8, 2, 1, 7, 4, 3]
[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1 0
- 算法代码实现之堆排序,Java实现
- Java实现排序算法之堆排序
- java实现排序算法之堆排序
- 排序算法之堆排序java实现
- 排序算法之堆排序 Java 实现
- 堆排序算法之JAVA实现
- 堆排序算法之Java实现
- java实现算法之堆排序
- Java算法实现之堆排序
- 堆排序算法代码实现
- 算法代码实现之堆排序,Golang(Go语言)实现
- 算法代码实现之堆排序,C/C++实现
- JAVA排序算法实现代码-堆(Heap)排序
- 堆排序java代码实现
- 堆排序算法-java实现
- Java实现堆排序算法
- Java实现堆排序算法
- 堆排序算法java实现
- Geekband C++学习笔记——浅谈引用与指针
- 【BZOJ3622】已经没有什么好害怕的了,两次DP
- Cube 逐点运动到点停止
- c++头文件问题
- android 无法连接真机调试
- 算法代码实现之堆排序,Java实现
- hadoop 集群调度 Azkaban2搭建
- Uva10305——Ordering Tasks
- 使用 iframe 实现在同一页面中显示不同的内容
- SQL Server 之T-SQL语言的学习
- 22.1-7
- 全排列模版
- POJ 刷题顺序
- 时间复杂度和最大子序列问题