堆就是一个完全二叉树,堆要求是指 该节点大于它的两个子节点。而两个字节点大小不一定。

堆排序的最坏时间复杂度为nlog(n),平均也为nlog(n),占用空间为o(1),是一种比较排序算法。

堆排序也可以用于找最大的k个数。时间复杂度为klog(n),因为建堆后,每次循环实际上都生成一个最大数。

下面见代码:

//从小到大排序
public class HeapSort {
private int[] A;
private int heapSize;
//构造函数,传入待排序数组
public HeapSort(int[] A){
this.A = A;
}
public int[] getSortedArray(){
return A;
} //从节点i出发,使得父节点的数不小于子节点的数
private void heapify(int i) {
//加1、加2后才是该节点的两个子节点
int left = 2*i + 1;
int right = 2*i + 2;
int largest = 0; //取得该节点、两个子节点中最大的编号
if (left < heapSize && A[left] > A[i]) {
largest = left;
}else {
largest = i;
} if (right < heapSize && A[right] > A[largest]) {
largest = right;
}
//若最大编号不是它,则继续建堆,否则就满足堆要求
if (largest != i) {
int temp = A[i];
A[i] = A[largest];
A[largest] = temp;
heapify(largest);
}
} private void buildHeap(){
heapSize = A.length;
for (int i = (heapSize/2 - 1); i >= 0; i--) {
heapify(i);
}
} private void heapSort(){
buildHeap();
int temp;
for (int i = A.length-1; i > 0; i--) {
temp = A[i];
A[i] = A[0];
A[0] = temp;
heapSize--;
heapify(0);
}
} public static void main(String[] args) {
//测试用例
int[] array = {16,4,10,14,7,9,3,2,8,1,5,3,6,100};
HeapSort heapSort = new HeapSort(array);
heapSort.heapSort();
for (int i : heapSort.A) {
System.out.println(i);
}
}
}

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

  1. java堆排序实现

    代码如下: public class HeapSort { public static void heapSort(DataWrap[] data) { System.out.println(&quo ...

  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. HDU 5988.Coding Contest 最小费用最大流

    Coding Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  2. [都是原创]Php simplexml 添加节点

    Php simplexml 添加节点 原始代码如下 //================<? //创建xml对象$xml = new SimpleXMLElement('<Messages ...

  3. c++文件中引用C代码

    下面提供一个比较完整的示例程序,一共有四个文件:main.cpp.test.c.test.h.test.hpp main.cpp #include "test.hpp" int m ...

  4. MySQL参数优化:back_log

    * 修改back_log参数值:由默认的50修改为500.(每个连接256kb, 占用:125M) back_log=500 查看mysql 当前系统默认back_log值,命令: show vari ...

  5. myeclipse部署项目的时候报No projects are available for deployment to this server但是项目明明存在

    如题,今天在尝试部署从SVN上down下来的项目时,发现不能被tomcat识别成web项目!原因是SVN上down下来的项目的结构并非典型的web项目.  解决办法,右键项目->properti ...

  6. springboot 碰到的问题

    1.在springboot 启动报错 ** WARNING ** : Your ApplicationContext is unlikely to start due to a @ComponentS ...

  7. redis知识积累

    redis 安装包:redis-3.0.6.tar.gz 打开 redis: cd /media/deepl/文档/ubuntutools/redis-3.0.6/src/ ./redis-serve ...

  8. Latex表格插入

    \begin{table}[h] \centering \caption{Traffic flows description} \begin{tabular}{|c||c|c|c|c|} \hline ...

  9. 使用spring boot +WebSocket实现(后台主动)消息推送

    言:使用此webscoket务必确保生产环境能兼容/支持!使用此webscoket务必确保生产环境能兼容/支持!使用此webscoket务必确保生产环境能兼容/支持!主要是tomcat的兼容与支持. ...

  10. Linux+mysql+apache+php

    1.1.1               所需软件 cmake ncourse mysql apr apr-util pcre apache php 1.1.2               解压缩软件 ...