代码如下:

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. Oracle行转列,列转行,行列相互转换

    1.行转列 SELECT WM_CONCAT(COLUMN_NAME) COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'T_CREATE_T ...

  2. HDU 4771 Stealing Harry Potter's Precious dfs+bfs

    Stealing Harry Potter's Precious Problem Description Harry Potter has some precious. For example, hi ...

  3. Window attributes属性详解

    以下属性以Dialog为例来讲解: <item name="windowBackground"> 窗体的背景 </item><item name=&q ...

  4. 【Hnoi2013】Bzoj3143 游走

    Position: http://www.lydsy.com/JudgeOnline/problem.php?id=3143 List Bzoj3143 Hnoi2013 游走 List Descri ...

  5. Istio 1.1部署实践

    前提条件 正确安装配置Kubernetes集群 CentOS Linux release 7.5.1804 安装 下载istio 1.1版本 [root@vm157 ~]# wget https:// ...

  6. PCB SQL SERVER 位运算应用实例

    在PCB行业,一个产品可能同时在多个工厂生产,举例:一个产品一条主记录,这条记录中会对应多个工厂的产地,而这个工厂产地个数不确定, 那么如何设计表结构存储这个不确定的工厂呢?这里想到了4个方式存储 一 ...

  7. PCB SQL Server 代码创建DbLink

    代码如下: ) ) ) ) ) SET @serverName = 'DbLinkName' --db链接名 SET @ip = '120.79.36.65' --需连接服务器的IP SET @dbN ...

  8. 洛谷P1182数列分段

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...

  9. [Swift通天遁地]七、数据与安全-(19)使用Swift实现原生的SHA1加密

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. 微信小程序之商品发布+编辑功能(多图片上传功能)

    小程序的商品发布页面:功能有多图片上传 遇到的问题记录一下:1.uploadFile成功之后返回的参数是json字符串,一定要用JSON.parse转换为object格式 2.因为商品发布和编辑都是在 ...