堆排序
2016-05-16 23:33
288 查看
最近心情烦躁的不行写不出来东西!哎
swap函数是交换函数!
把n个元素建立一个堆,首先可以将这n个结点以自顶点向下,从左到右的方式从1到n进行编号,这样就可以把n个结点转换为一棵完全二叉树,紧接着从最后一个非叶节点开始到根节点,(这里用到了二叉树的性质最后一个非叶节点的位置怎么求,在一棵树中能做父节点的结点有n/2个),开始从后往前扫描,根节点为1,做个扫描所有的节点,根据需要向下调整,直到以当前结点为根的节点的子树符合堆的特性:
核心代码只有两行:
在这里我顺便实现了堆排序!其实还是可以优化的的这个代码!哈哈!
import java.io.BufferedInputStream; import java.util.Scanner; /** * * @类描述:堆 && 实现堆排序 * @项目名称:Aha_suanfa * @类名称:Dui * @修改备注: * @version v1.0 * @Copyright go3c */ public class Dui { static int[] h = new int[101]; static int n; public static void main(String args[]) { Scanner sc = new Scanner(new BufferedInputStream(System.in)); n = sc.nextInt(); int num = n; for (int i = 1; i <= n; i++) { h[i] = sc.nextInt(); } create(); System.out.println(); for (int i = 1; i <= num; i++) { System.out.print(deleteMax() + " "); } } public static void create() //建立 堆,按数组从头到尾 依次放入堆中,然后进行调整,这里用一维数组存储堆 { for (int i = n/2; i >= 1; i--) { siftdown(i); } } public static int deleteMax() { int t; t = h[1]; h[1] = h ; n--; siftdown(1); return t; } private static void siftdown(int i) { // TODO Auto-generated method stub int t, flag = 0; while (i * 2 <= n && flag == 0) { if (h[i] > h[i * 2])// 取小·:先考虑左边的孩子 t = i * 2; else t = i; if (i * 2 + 1 <= n) {// 取小,考虑右边的孩子。左右之间取最小的 if (h[t] > h[i * 2 + 1]) { t = i * 2 + 1; } } if (t != i) { swap(t, i); i = t; } else { flag = 1; } } } private static void swap(int x, int y) { // TODO Auto-generated method stub int t; t = h[x]; h[x] = h[y]; h[y] = t; } }
swap函数是交换函数!
把n个元素建立一个堆,首先可以将这n个结点以自顶点向下,从左到右的方式从1到n进行编号,这样就可以把n个结点转换为一棵完全二叉树,紧接着从最后一个非叶节点开始到根节点,(这里用到了二叉树的性质最后一个非叶节点的位置怎么求,在一棵树中能做父节点的结点有n/2个),开始从后往前扫描,根节点为1,做个扫描所有的节点,根据需要向下调整,直到以当前结点为根的节点的子树符合堆的特性:
核心代码只有两行:
for (int i = n/2; i >= 1; i--) { siftdown(i); }
在这里我顺便实现了堆排序!其实还是可以优化的的这个代码!哈哈!
相关文章推荐
- 数据结构第一讲
- numerical
- Linux Proc文件系统
- android布局属性详解
- Android的Window
- 风花雪月
- Simple Tree Traverse(遍历)
- 七、二叉排序树--(1)什么是二叉排序树
- java正则匹配及替换的一点思考
- PHP IDE phpstorm 常用快捷键
- 电脑默认F1F2F3F4F5F6功能不管用,必须要按Fn这个键,怎么不按?直接按f1-f12
- 程序员都应该懂点心理学
- EntityFramework Code-First 简易教程(五)-------领域类配置
- C 和 C++ 一些基础
- 3月7日作业
- POJ 3237 Tree 树链剖分(路径剖分
- HYSBZ - 2152 聪聪和可可
- 3月9日作业
- HYSBZ - 2152
- 《Wireshark 网络分析就这么简单》学习笔记