java 堆排序的实现
堆就是一个完全二叉树,堆要求是指 该节点大于它的两个子节点。而两个字节点大小不一定。
堆排序的最坏时间复杂度为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 堆排序的实现的更多相关文章
- java堆排序实现
代码如下: public class HeapSort { public static void heapSort(DataWrap[] data) { System.out.println(&quo ...
- java堆排序(大根堆)
实现堆排序的算法思路是先创建堆,也就是从叶子节点起对每一层的孩子节点及其对应位置的父亲节点进行比较,较大的孩子节点替换较小的父亲节点,一级一级比较替换,就创建出了大根堆,小根堆反之.创建好大根堆以后, ...
- 9 Java 堆排序
堆是具有以下性质的完全二叉树,每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆.如下图: 同时,我们对堆中的结点按层进行编号,将这种逻 ...
- java堆排序
直接贴源代码: package com.java.fmd; import java.util.Scanner; public class HeapSort { int[] arr; public st ...
- Hark的数据结构与算法练习之堆排序
前言 堆排序我是看了好半天别人的博客才有了理解,然后又费了九牛二虎之力才把代码写出来,我发现我的基础真的很差劲啊……不过自己选的路一定要坚持走下去.我试着把我的理解描述出来,如有不妥之处希望大家可以指 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 堆排序算法 java 实现
堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...
- 【算法与数据结构】冒泡、插入、归并、堆排序、快速排序的Java实现代码
详细过程就不表了,看代码吧 import java.util.Arrays; public class Sort { static int swapTimes=0; public static voi ...
- java基础之:堆排序
最近做题目饱受打击,愈发觉得打好基础的重要性,于是乎,决心把基本的排序算法还有数组操作一一实现,目的在于一方面能够得到对JAVA基础的巩固,另一面在实现的过程中发现不足. 今天所实现的堆排序(最大堆) ...
随机推荐
- Xcode 折叠代码快捷键
Xcode9之前版本可以代码局部和全局折叠,但是9之后只能以某个函数为单位进行全局折叠,特别是里面的逻辑判断的代码不能局部折叠了... Xcode9之前版本代码折叠: 在Xcode菜单里选择Prefe ...
- 爬虫初窥day2:正则
正则在线测试 http://tool.oschina.net/regex https://www.regexpal.com/ http://tool.chinaz.com/regex exp1:筛选所 ...
- 通过代理上网时,qq等应用程序连网出错
虽然现在基本上都用无线,有线宽带等,但是有时候还是避免不了通过代理上网时,于是就发生浏览器可以正常浏览网页,qq等应用程序连接出错等问题,上网搜了好长时间, 都没解决问题,后来慢慢琢磨(其实是乱 ...
- gsl库安装
下载ftp://ftp.gnu.org/gnu/gsl/ 下载后解压,可以按照文件夹中INSTALL文件的指导,进入解压文件夹"gsl-2.4"执行以下5步: ./configur ...
- openssl pem密钥文件rsa加密解密例子
准备工作 命令行加密解密,用与比对代码中的算法和命令行的算法是否一致 C:\openssl_test>openssl rsautl -encrypt -in data.txt -inkey pu ...
- Python Tutor
Python Tutor Python Tutor 是由 Philip Guo 开发的一个免费教育工具,可帮助学生攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程.通过这个工具, ...
- 《Django By Example》第一章 学习笔记
首先看了下目录,在这章里 将会学到 安装Django并创建你的第一个项目 设计模型(models)并且生成模型(model)数据库迁移 给你的模型(models)创建一个管理站点 使用查询集(Quer ...
- NOIP训练测试2(2017081502)
唔,这是今天第二场训练测试. 上一轮不够难,现在来一波更简单的.[滑稽] 注意时间! 测试时间:3小时 题目一:Cantor表 题目二:回文数 题目三:拼数 题目四:进制位 题目五:邮票面值设计 都是 ...
- 深入C# String类
深入C# String类 C#中的String类 他是专门处理字符串的(String),他在System的命名空间下,在C#中我们使用的是string 小写的string只是大写的String的一个别 ...
- mybatis 使用merge into
前一篇博客,oracle的merge into语法 : oracle merge into语法 mybatis 使用merge into,跟一般的update写法相同: <update id=& ...