package practice;

import edu.princeton.cs.algs4.StdRandom;

public class TestMain {
public static void main(String[] args) {
int[] a = new int[20];
for (int i = 0; i < a.length; i++) {
int temp = (int)(StdRandom.random()*100);
a[i] = temp;
}
HeapSrot.sort(a);
for (int i = 1; i < a.length; i++) { //只能从a[1]开始排
System.out.print(a[i]+" ");
}
System.out.println();
}
} class HeapSrot{
public static void sort(int[] a) {
int p = a.length;
for (int k = p/2; k >= 1; k--) { //因为没有子元素的节点不用处理,所以只处理一半元素
sink(a, k, p); //从下往上将所有(不包括没有子元素的节点),节点沉一遍,整个数组则堆有序
} //为什么不像优先队列那样插入再上浮,因为这样可以快20%~30%
while (p > 1) { //和优先队列弹出最大元素并删除操作一样,不是删除而是将最大元素移到末尾
exch(a, 1, --p); //将第一个移到末尾
sink(a, 1, p); //将换上来的沉下去
}
}
/*
* 下沉
*/
private static void sink(int[] a,int k,int p) { //将元素与子元素比较,比子元素小则和两个中较大的那个换位置
while ((2*k + 1) < p && ((a[k] < a[2*k + 1]) || (a[k] < a[2*k]))) {
if (a[2*k + 1] > a[2*k]) { exch(a, k, 2*k + 1); k = 2*k + 1; }
else { exch(a, k, 2*k); k = 2*k; }
}
}
/*
* 交换
*/
private static void exch (int[] a,int i, int j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}

算法动画演示

http://www.cs.usfca.edu/~galles/visualization/HeapSort.html

堆排序Java实现的更多相关文章

  1. 堆排序 java实现

    import java.util.Arrays; /* * 思路: * 1.方法adjustDown:对于一个数组a[],针对第i个数进行向下(直到len-1)调整,使得该位置成为大顶堆 * 2.方法 ...

  2. 堆排序 java

    <pre name="code" class="java">package heapSort; /** * 大根堆 * @author root * ...

  3. 堆排序—Java

    堆排序: 一棵完全二叉树,如果父节点的值大于等于左右节点的值,则称此完全二叉树为小根堆(小顶堆):如果父节点的值小于等于左右节点的值,则次完全二叉树为大根堆(大顶堆). 堆排序是建立在大顶堆或小顶堆的 ...

  4. 堆排序(Java数组实现)

    堆排序:利用大根堆 数组全部入堆,再出堆从后向前插入回数组中,数组就从小到大有序了. public class MaxHeap<T extends Comparable<? super T ...

  5. 排序算法(三)堆排序及有界堆排序Java实现及分析

    1.堆排序基数排序适用于大小有界的东西,除了他之外,还有一种你可能遇到的其它专用排序算法:有界堆排序.如果你在处理非常大的数据集,你想要得到前 10 个或者前k个元素,其中k远小于n,它是很有用的. ...

  6. 堆排序——Java实现

    一.堆排序 堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 二.堆 什 ...

  7. 堆排序算法 java 实现

    堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...

  8. 20172302 《Java软件结构与数据结构》第八周学习总结

    2018年学习总结博客总目录:第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 教材学习内容总结 第十二章 优先队列与堆 1.堆(heap)是具有两个附加属性的一棵二叉树: (1)它是一 ...

  9. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

随机推荐

  1. JPA Advanced Mappings(映射)

    JPA Advanced Mappings(映射) JPA是一个使用java规范发布的库.因此,它支持所有面向对象的实体持久性概念. 原文链接:http://blogxinxiucan.sh1.new ...

  2. Android学习笔记-Button(按钮)

    Button是TextView的子类,所以TextView上很多属性也可以应用到Button 上!我们实际开发中对于Button的,无非是对按钮的几个状态做相应的操作,比如:按钮按下的时候 用一种颜色 ...

  3. 移动端touch事件封装

    <meta charset="utf-8"><meta name="viewport" content="width=device- ...

  4. SSE再学习:灵活运用SIMD指令6倍提升Sobel边缘检测的速度(4000*3000的24位图像时间由180ms降低到30ms)。

    这半年多时间,基本都在折腾一些基本的优化,有很多都是十几年前的技术了,从随大流的角度来考虑,研究这些东西在很多人看来是浪费时间了,即不能赚钱,也对工作能力提升无啥帮助.可我觉得人类所谓的幸福,可以分为 ...

  5. jQuery实现拼图小游戏

    小熊维尼拼图                                                                                    2017-07-23 ...

  6. swift3.0 从相册选取或者拍照上传图片至阿里云OSS

    导入相应的库 import Photos import AliyunOSSiOS 选取照片需要继承 UIImagePickerControllerDelegate,UINavigationContro ...

  7. Mook第八周习题 单词长度(4分)(1)题

    题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以'.'结束.你要输出这行文本中每个单词的长度.这里的单词与语言无关,可以包括各种符号,比如"it's"算一个单词, ...

  8. [算法题] Remove Element

    题目内容 本题来源:LeetCode Given an array and a value, remove all instances of that value in place and retur ...

  9. 计蒜客模拟赛D2T2 蒜头君的排序:区间逆序对(移动端点) + 树状数组

    题目链接:https://nanti.jisuanke.com/t/16443 题意: 给你一个由1~n构成的正整数序列,有m组询问,每组询问要求输出[l , r]区间内的逆序对个数. 数据范围: 对 ...

  10. 调整ORACLE用户关闭密码有效期

    --调整ORACLE用户关闭密码有效期  ----------------------------------2013/11/12 在oracle中执行一下操作:1.查看用户的proifle是那个,一 ...