堆排序算法 java 实现
堆排序算法 java 实现
算法概念
堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。堆排序是不稳定的排序方法,辅助空间为O(1), 最坏时间复杂度为O(nlog2n) ,堆排序的堆序的平均性能较接近于最坏性能。
算法思想
建立最小堆;
取出堆顶元素,顺序放到待排序数组中;将堆底元素放到堆顶,并重新调整堆;
重复步骤 2 ,直至堆中所有元素全部取完;
参考的两篇文章都是将堆顶元素和堆底元素互换,最后存放堆的数组就变成了有序数组。
- 建立最大堆;
- 将堆顶元素和堆底元素互换;重新调整除堆底有序元素外的堆;
- 重复步骤 2 ,直至堆中全部元素都变有序;
算法实现
package com.lygedi.sort;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
public class HeapSort {
public static void main(String[] args) {
int a[] = { 49, 38, 65, 9, 76, 13, 27, 49, 8, 34, 12, 64, 49, 56, 2, 51, 13, 5, 4, 62, 99, 98, 54, 56, 17, 17,
18, 23, 34, 56, 15, 35, 25, 53, 51 };
int[] b = a.clone();
HeapSort hs = new HeapSort();
hs.sortByMinHeapClass(a);
hs.sortByOneMothed(b);
System.out.println(a.length);
for (int i = 0; i < a.length; i++)
System.out.println(Integer.toString(i) + "-" + a[i] + "--" + b[i]);
}
public void sortByMinHeapClass(int[] list) {
MinHeap mh = new MinHeap(list);
System.out.println(mh);
for (int i = 0; i < list.length; i++) {
list[i] = mh.pushTop();
}
}
public void sortByOneMothed(int[] list){
for(int i = list.length-1; i>=0; i--){
initMaxHeap(list,0,i);
swap(list,0,i);
}
}
private void initMaxHeap(int[] list,int startIndex,int stopIndex){
int leftChild, rightChild;
boolean isChanged = false;
for(int i=startIndex;i<=stopIndex;i++){
leftChild = i*2 + 1;
rightChild = i*2 + 2;
if(leftChild<=stopIndex && list[i]<list[leftChild]){
swap(list,i,leftChild);
isChanged = true;
}
if(rightChild<=stopIndex && list[i]<list[rightChild]){
swap(list,i,rightChild);
isChanged = true;
}
if(i>startIndex && isChanged){
i = (i - 1)/2 - 1;
isChanged = false;
}
}
}
private void swap(int[] list,int i,int j){
int temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
class MinHeap {
private int[] heap;
public MinHeap(int[] list) {
heap = list;
fixHeap();
}
public int pushTop() {
int top = heap[0];
int tail = heap[heap.length - 1];
if (heap.length > 1) {
int[] newheap = ArrayUtils.subarray(heap, 0, heap.length - 1);
newheap[0] = tail;
heap = newheap;
fixHeap();
}
return top;
}
private void swap(int[] list,int i,int j){
int temp = list[i];
list[i] = list[j];
list[j] = temp;
}
private void fixHeap() {
int leftChild, rightChild;
boolean isChanged = false;
for (int i = 0; i < heap.length; i++) {
leftChild = i * 2 + 1;
rightChild = i * 2 + 2;
if (leftChild <= heap.length - 1 && heap[i] > heap[leftChild]) {
swap(heap,i,leftChild);
isChanged = true;
}
if (rightChild <= heap.length - 1 && heap[i] > heap[rightChild]) {
swap(heap,i,rightChild);
isChanged = true;
}
//如果子节点进行了调整,则要对父节点重新进行调整
if (isChanged && i > 0) {
i = (i - 1) / 2 - 1;
isChanged = false;
}
}
}
public String toString() {
StringBuilder sb = new StringBuilder();
int count = heap.length;
int grade = (int) Math.ceil(java.lang.StrictMath.pow(count, 1.0 / 2));
String padding = "**";
int index = 0;
for (int i = 1; i <= grade; i++) {
int padNum = (int)Math.pow(2, grade-i+1)-1;
String gradePadding = StringUtils.repeat(padding, padNum);
for (int j = 1; j <= Math.pow(2, i - 1); j++) {
if (index < count) {
sb.append(gradePadding);
String paddingInt = StringUtils.leftPad(Integer.toString(heap[index]), padding.length(), "*");
sb.append(paddingInt);
index++;
sb.append(gradePadding);
sb.append(padding);
}
}
sb.append("\r\n\r\n\r\n");
}
return sb.toString();
}
}
堆排序算法 java 实现的更多相关文章
- 排序系列 之 堆排序算法 —— Java实现
基本概念: 二叉堆是完全二叉树或者是近似完全二叉树. 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆. 当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆. 一般将二叉堆简称 ...
- 堆排序算法(Java实现)
将待排序的序列构造成一个大顶堆(从大到小排要构造成小顶堆).此时,整个序列的最大值就是堆顶的根节点,将他和末尾元素交换,然后将剩余的length-1个节点序列重新构造成新的堆.重复执行,便能得到一个有 ...
- 算法-java代码实现堆排序
堆排序 第7节 堆排序练习题 对于一个int数组,请编写一个堆排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2 ...
- 堆排序算法的java实现
堆积排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素.堆排序是不稳定的排序方法,辅助空间为O(1), 最坏时间复杂度为O ...
- 必须知道的八大种排序算法【java实现】(三) 归并排序算法、堆排序算法详解
一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...
- 排序算法入门之堆排序(Java实现)
堆排序 在学习了二叉堆(优先队列)以后,我们来看看堆排序.堆排序总的运行时间为O(NlonN). 堆的概念 堆是以数组作为存储结构. 可以看出,它们满足以下规律: 设当前元素在数组中以R[i]表示,那 ...
- 【java排序】 归并排序算法、堆排序算法
一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...
- 八大排序算法Java实现
本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...
- 排序算法(Java实现)
这几天一直在看严蔚敏老师的那本<数据结构>那本书.之前第一次学懵懵逼逼,当再次看的时候,发觉写的是非常详细,非常的好. 那就把相关的排序算法用我熟悉的Java语言记录下来了.以下排序算法是 ...
随机推荐
- php获取html纯文本,解决编辑器手动键入空格造成的无意义空白字符(空值问题)
在项目中,我们常常需要用到一些验证,不管是前台还是后台的,上传的问题时,需要内容不为空,但可视化编辑器的介入让手动敲入空格跳出了常规的检测.空格是一种排版的手段,但毫无内容只有空格就显得没有意义了,今 ...
- ECMAScript 6(ES6)有什么新东西
你可能已经听说过ECMAScript 6,JavaScript的下一个版本,它有一些非常棒的新功能.这些功能略微复杂,在简单的脚本和复杂的应用中都可以使用.在这篇文章中,我们将挑选一些ES6的功能进行 ...
- ArcEngine 岛状多边形内部环的获取
ArcEngine岛状多边形获取其内部环 查阅了帮助文档相关接口,内部环的获方法get_InteriorRingBag() 需要外部环作为参数.而外部环可以直接通过ExteriorRingBag属性获 ...
- Hibernate 二级缓存的配置及使用_EhCache
大多数的应用程序中都会添加缓存模块,以减少数据库访问次数,同时增加响应速度.下面介绍一下hibernate的二级缓存.默认情况下hibernate的二级缓存是不开启的,我们需要手动配置并启用. 注: ...
- ext3是对ext2文件系统的一个扩展高性能日志文件系统
嵌入式开发者所做的最重要的决定之一就是部署哪种文件系统.有些文件系统性能比较高有些文件系统空间利用率比较高,还有一些文件系统设备故障或者意外断电后恢复数据比较方便. linux文件系统概念 分区 分区 ...
- Struts2拦截器的使用 (详解)
Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...
- 《Linux内核设计与实现》读书笔记 第五章 系统调用
第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用在用户空间进程和硬件设备间添加了一个中间层, 作用:为用户空间提供了一种 ...
- mycat的读写分离设置
官网:http://www.mycat.org.cn/ 一.jdk环境的安装1.安装jdk1.7,这是mycat推荐的jdk环境 2.之前是用yum安装的jdk1.6,首先查找下 #yum info ...
- Pycharm Professional Edition 激活码(license)
http://blog.csdn.net/yangysc/article/details/52355865 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiw ...
- [ZJOI2008]树的统计
本题是一个树链剖分裸题,由于比较菜,老是RE,后来发现是因为使用了全局变量. /************************************************************ ...