代码如下:

public class HeapSort {
public static void heapSort(DataWrap[] data)
{
System.out.println("开始排序");
int length = data.length;
//循环建堆
for(int i = 0;i < length-1; i++)
{
//建堆
buiilMaxdHeap(data , length-1-i);
//交换堆订和最后一个元素
swap(data , 0, length-1-i);
System.out.println(java.util.Arrays.toString(data));
}
}
//交换data数组中i和j两处索引的元素
private static void swap(DataWrap[] data, int i, int j) {
DataWrap tmp = data[i];
data[i] = data[j];
data[j] = tmp; }
//对data数组从0到lastindex建最大堆
private static void buiilMaxdHeap(DataWrap[] data, int lastindex) {
//从lastindex处节点(最后一个节点)的父节点开始
for(int i = (lastindex -1)/2;i >= 0;i--)
{
//k保存当前正在判断的节点
int k = i;
//如果当前k节点的子节点存在
while(k * 2+1 <= lastindex)
{
//k节点的左子节点的索引
int biggerIndex = 2*k+1;
//如果biggerIndex小于lastindex,即biggerindex+1
if(biggerIndex < lastindex)
{
//如果右子节点的值较大
if(data[biggerIndex].compareTo(data[biggerIndex+1]) < 0)
{
//biggerIndex总是记录较大子节点的索引
biggerIndex++;
}
}
//如果k节点的值小于较大字节点的值
if(data[k].compareTo(data[biggerIndex]) < 0)
{
//交换它们
swap(data, k, biggerIndex);
//将biggerIndex赋给k,开始while循环的下一次的循环
k = biggerIndex;
}
else
{
break;
}
}
}
}
public static void main(String[] args) {
DataWrap [] data = {
new DataWrap(21, ""),
new DataWrap(30, ""),
new DataWrap(49, ""),
new DataWrap(30, ""),
new DataWrap(21, ""),
new DataWrap(16, ""),
new DataWrap(9, "")
};
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
heapSort(data);
System.out.println("排序之后:\n" + java.util.Arrays.toString(data));
}
}

说明:

上面堆排序的关键在于buildMaxHeap()方法。该方法用于对data数组从0到lastindex索引范围内的元素建大顶堆,这样就选择出数组索引从0到lastindex范围内的最大元素。采用循环不断重复上面过程即可完成堆排序。

对于堆排序算法而言,假设有n项数据,需要进行n-1次建堆,每次建堆本身耗时为log2n,则其时间效率为O(nlog2n)。堆排序的空间效率很高,它只需要一个附加的程序单元用于交换,其空间效率为O(1)。

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

  1. java 堆排序的实现

    堆就是一个完全二叉树,堆要求是指 该节点大于它的两个子节点.而两个字节点大小不一定. 堆排序的最坏时间复杂度为nlog(n),平均也为nlog(n),占用空间为o(1),是一种比较排序算法. 堆排序也 ...

  2. java堆排序(大根堆)

    实现堆排序的算法思路是先创建堆,也就是从叶子节点起对每一层的孩子节点及其对应位置的父亲节点进行比较,较大的孩子节点替换较小的父亲节点,一级一级比较替换,就创建出了大根堆,小根堆反之.创建好大根堆以后, ...

  3. 9 Java 堆排序

    堆是具有以下性质的完全二叉树,每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆.如下图: 同时,我们对堆中的结点按层进行编号,将这种逻 ...

  4. java堆排序

    直接贴源代码: package com.java.fmd; import java.util.Scanner; public class HeapSort { int[] arr; public st ...

  5. Hark的数据结构与算法练习之堆排序

    前言 堆排序我是看了好半天别人的博客才有了理解,然后又费了九牛二虎之力才把代码写出来,我发现我的基础真的很差劲啊……不过自己选的路一定要坚持走下去.我试着把我的理解描述出来,如有不妥之处希望大家可以指 ...

  6. Spark案例分析

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

  7. 堆排序算法 java 实现

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

  8. 【算法与数据结构】冒泡、插入、归并、堆排序、快速排序的Java实现代码

    详细过程就不表了,看代码吧 import java.util.Arrays; public class Sort { static int swapTimes=0; public static voi ...

  9. java基础之:堆排序

    最近做题目饱受打击,愈发觉得打好基础的重要性,于是乎,决心把基本的排序算法还有数组操作一一实现,目的在于一方面能够得到对JAVA基础的巩固,另一面在实现的过程中发现不足. 今天所实现的堆排序(最大堆) ...

随机推荐

  1. web的自己主动化公布

    </pre>基于眼下业务的版本号.使用的maven 及tomcat <p></p><p>假设我们使用 Jenkins 公布是比較好的,可是存在一定的问题 ...

  2. CentOS6.5下用Git克隆代码(https方式)

    一.首先最好保证GIT是最新版 查看GIT命令 $ git --version 有关git的安装,应该有好多文章介绍.注意更新之后,要重启系统,否则显示的版本号,还是老版本. 二.如果工作环境存在网络 ...

  3. 【HDU 4864】 Task

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4864 [算法] 贪心 不妨将两个数组分别按x从大到小排序 然后枚举每件物品,选择x值大于该物品的且 ...

  4. bzoj4668

    并查集+最小生成树 首先我们发现这题可以lct维护最小生成树,但是发现如果生成树在之后是不会修改的,那么就想到了并查集,然后就不知道怎么做了... 其实当我们连接两个连通块的时候,两个连通块只能通过这 ...

  5. 03-vue实例生命周期和vue-resource

    vue实例的生命周期 什么是生命周期:从Vue实例创建.运行.到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期! 生命周期钩子:就是生命周期事件的别名而已: 生命周期钩子 = 生命周期函 ...

  6. zoj3675 BFS+状态压缩

    #include <stdio.h> #include <string.h> #include <queue> using namespace std; int n ...

  7. 高斯消元_HihoCoderOffer6_03

    题目3 : 图像算子 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在图像处理的技术中,经常会用到算子与图像进行卷积运算,从而达到平滑图像或是查找边界的效果. 假设原图 ...

  8. Mysql(三):多表查询和存储程序

    今天内容: ● 多表查询(内连接 外连接 子查询) ● 存储程序(存储过程 函数) 多表查询 ​ 同时从多张数据表中查取到需要的数据即是多表查询. 多表查询时,参与查询的表中每条数据进行组合,这种效果 ...

  9. js中添加node.js语法支持

    File——>settings

  10. Android项目实战_手机安全卫士软件管家

    ###1.应用程序信息的flags 1. int flags = packageInfo.applicationInfo.flags2. 0000 0000 0000 0000 0000 0000 0 ...