堆排序
来源:互联网 发布:淘宝拍摄摄影学校 编辑:程序博客网 时间:2024/06/05 07:31
最近心情烦躁的不行写不出来东西!哎
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]; 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); }
在这里我顺便实现了堆排序!其实还是可以优化的的这个代码!哈哈!
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 柴俊理金:5、16午夜黄金、宁贵沥青操作策略
- 删除文件夹和复制文件夹 java
- 一个操作系统的实现(3)-保护模式进阶
- iOS开发中常见的单例类
- makefile&Android mk文件中打印log
- 堆排序
- Jersey 2.22.2 官方文档第3章学习笔记
- Dekker's算法和Peterson算法
- 【Linux基础】常用服务器构建
- 300. Longest Increasing Subsequence
- 组或资源的状态不是执行请求操作的正确状态
- 2016"百度之星" - 资格赛————Problem B
- Java实现蛇形举证_2
- football <水题>