堆排序
来源:互联网 发布:win7仿linux主题 编辑:程序博客网 时间:2024/04/30 02:07
思路:
使用数组存储,父节点与左右孩子节点的映射关系为
k为父节点,则左孩子为2k+1,右孩子为2k+2;
k为孩子节点,其父节点为(k-1)/2.
(1)、从最后一个非叶子节点开始倒序建立初始堆。
(2)、输出堆顶元素,把最后一个叶子节点放到堆顶,重新调整为堆。
(3)、重复(2)直到堆中没有元素。
package Lesson1;public class MyHeap {// a为堆数据;n为有效数据个数;k为待筛选节点static void heapAjust(int[] a, int n, int k) {// 对节点k进行筛选,往下落int k1 = 2 * k + 1;// 左右孩子int k2 = 2 * k + 2;if (k1 >= n && k2 >= n) {// 叶子节点不需调整return;}int a1 = Integer.MAX_VALUE;int a2 = Integer.MAX_VALUE;if (k1 < n) {a1 = a[k1];}if (k2 < n) {a2 = a[k2];}if (a[k] <= a1 && a[k] <= a2) {return;}if (a1 < a2) {int t = a[k];a[k] = a[k1];a[k1] = t;heapAjust(a, n, k1);} else {int t = a[k];a[k] = a[k2];a[k2] = t;heapAjust(a, n, k2);}}static void heapSort(int[] a) {// 建立初始堆,从最后一个非叶子节点往上调整for (int i = (a.length - 1) / 2; i >= 0; i--) {heapAjust(a, a.length, i);}int n = a.length;// 有效元素个数while (n > 0) {// 输出System.out.print(a[0] + " ");// 输出堆顶元素a[0] = a[n - 1];// 把最后一个元素放到堆顶n--;heapAjust(a, n, 0);// 调整堆顶元素}System.out.println();}public static void main(String[] args) {int[] a = { 12, 3, 6, 8, 5, 19, 20, 16, 4, 2, 7, 13, 9, 11 };heapSort(a);// 堆排序/* * for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } * System.out.println(); */}}
reference
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- JSONObject与JSONArray
- 图论复习之强连通分量以及缩点—Tarjan算法
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 总结
- Machine Learing导读。
- 一个简单的时钟
- 堆排序
- 时钟得计时
- c#某个捉摸不清的引用
- 2014ACM-ICPC 地区赛鞍山站小结
- 第八周项目——个人所得税计算器(2)
- POJ 2449 Remmarguts' Date ( Dijkstra + A* 求解第K短路 )
- 最新场景文字检测进展(含代码)
- C++ RTTI及“反射”技术
- tmux的使用方法和个性化配置