Java八大排序之堆排序
堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
根据根结点是否是最大值还是最小值和子结点的键值是否小于还是大于它的父结点可分为两种堆,如下:
1.大顶堆:每个结点的键值都小于它的父结点;
2.小顶堆:每个结点的键值都大于它的父节点;
堆排序基本思想:
1.将数组排列成大顶堆(或小顶堆);
2.把根结点和尾结点交换,然后把n-1个元素重新构成一个大顶堆(或小顶堆);
3.重复第2步,直到最后一个元素。
流程图(为了不太麻烦,所以就减少些数据):
一,先将数组排序成大顶堆
二,把根结点和末尾结点交换
代码:
/**
* 堆排序
*/
public class TestHeap {
//创建大顶堆
public static void maximumHeap(int k, int[] arr,int m) {
int i, j, temp;
boolean finished;
i = k;
j = 2*i+1;
temp = arr[k];
finished = false;
while((j <= m) && !finished){
//孩子结点位置小于数组长度 且 右孩子大于左孩子
if ((j < m) && (arr[j+1] > arr[j])){
j++; //把右孩子结点当作最大孩子结点
}
//如果最大的孩子结点小于其根节点
if (temp >= arr[j]){
finished = true; //结束循环
}else{
//把最大子节点赋给根结点
arr[i] = arr[j];
i = j;
//循环下一个根结点
j = 2*j+1;
}
}
arr[i] = temp;
} //交换
public static void heapsort(int[] arrays) {
int i;
//从最后一个非叶节点开始构建大顶堆
for (i = arrays.length / 2 - 1; i >= 0; i--) {
maximumHeap(i, arrays, arrays.length);
}
System.out.println("建堆后:" + Arrays.toString(arrays));
//从最小的叶子节点开始与根节点进行交换并重新构建大顶堆
for (i = arrays.length - 1; i >= 1; i--) {
int temp = arrays[i];
arrays[i] = arrays[0];
arrays[0] = temp;
maximumHeap(0, arrays,i-1);
}
System.out.println(Arrays.toString(arrays));
} public static void main(String[] args) {
int[] arrays = {49, 38, 65, 97, 176, 213, 227, 49, 78, 34, 12, 164, 11, 18, 1};
heapsort(arrays);
}
}
测试结果:
建堆后:[227, 176, 213, 97, 38, 164, 65, 49, 78, 34, 12, 49, 11, 18, 1]
[1, 11, 12, 18, 34, 38, 49, 49, 65, 78, 97, 164, 176, 213, 227]
时间复杂度:堆排序方法对记录数n较大的文件排序是很好的,但当n较小时,不提倡使用,因为初始建堆和调整建新堆时要进行反复的筛选。堆排序时间复杂度为O(nlog2n)。
堆排序只需存放一个记录的附加空间。
堆排序是一种不稳定的排序算法。
结语:堆排序是为了即要保存中间比较结果,减少后面的比较次数,又不占用大量的附加存储空间,使排序算法具有较好的性能才被Willioms和Floyd在1964年提出的。
Java八大排序之堆排序的更多相关文章
- Java八大排序算法
Java八大排序算法: package sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List ...
- 八大排序算法——堆排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演示 二.思路分析 先来了解下堆的相关概念:堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆.如 ...
- java八大排序代码
import java.util.ArrayList;import java.util.List; public class FastSort { public static void main(St ...
- 必须知道的Java八大排序算法
冒泡排序.简单选择.直接插入.快速排序.堆排序.希尔排序.归并排序.基数排序. 将其按排序方式分类如下图所示: 1.冒泡排序: 基本思想——在要排序的一组数中,对当前还未排好序的范围内的全部数据,自上 ...
- Java八大排序之希尔(Shell)排序
希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该 ...
- Java八大排序之插入排序
插入排序 也可叫直接插入排序,该算法的思路是:初始可认为文件中的第1个记录已排好序,然后将第2个到第n个记录依次插入到已排序的记录组成的文件中. 步骤: 假设有一组数组为(数组下标0—n-1): ar ...
- Java八大排序之基数排序
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分 ...
- 八大排序算法Java
目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...
- 八大排序算法Java实现
本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...
随机推荐
- mark-杭州互联网公司分布-位置信息
项目内容: 在智联招聘上爬取杭州市互联网公司的位置信息,属于哪个区: 如果公司信息内不含区信息,则通过百度地图接口获取所属区信息 scrapy+pycharm
- 知识点总结 JS(ES6)
一.新增数据类型Symbol 概念: Symbol代表独一无二的 Symbol类型的值通过Symbol函数来生成,同时Symbol函数返回的值的唯一的 Symbol函数可以接收字符串作为参数,但是即使 ...
- 【Comet OJ - Contest #0 A】解方程(数学水题)
点此看题面 大致题意: 给定自然数\(n\),让你求出方程\(\sqrt{x-\sqrt n}+\sqrt y-\sqrt z=0\)的自然数解\(x,y,z\)的数量以及所有解\(xyz\)之和. ...
- MySQL实战45讲学习笔记:第八讲
一.今日内容概要 我在第 3 篇文章和你讲事务隔离级别的时候提到过,如果是可重复读隔离级别,事务 T 启动的时候会创建一个视图 read-view,之后事务 T 执行期间,即使有其他事务修改了数据,事 ...
- 【微信小程序】 小程序中的递归运算/二分查找算法/Maximum call stack size exceeded
摘要: 小程序中的递归运算/二分查找算法/Maximum call stack size exceeded 场景:最近做一个车贷计算器, 其中存在一个公式如下: /**** 总金额 * 月利率 * ( ...
- java 多行注释
public class Sample { public static void main(String[] args) { // java compiler ignores the comment ...
- Java GUI : 实现排序算法的动态演示
0.用到的jar包 jcommon-1.0.16.jar.jfreechart-1.0.13.jar 1.实现思路 自定义一个类---用于存放排序算法的操作状态--SortEntity 定义一个方法类 ...
- thinkphp5.0学习(九):TP5.0视图和模板
原文地址:http://blog.csdn.net/fight_tianer/article/details/78602711 一.视图 1.加载页面 1.继承系统控制器类 return $this- ...
- Java 中 override 和 overload 区别
问题出现: 即使对于一个经验丰富的开发人员来说,方法重载和方法覆盖的区别都能让他犹豫一下, 对于新手来说,经常容易弄混淆. 有没有比较深入浅出的理解方式,能让人过目不忘,用起来还能有条件反射般的速度呢 ...
- qps.sh
mysql -p'' -Bse'show global status like "com_%";' > qps.new while true do sleep 0.5 mv ...