java排序算法(三)堆排序

堆积排序(HeapSort)是指利用堆积树这种结构所设计的排序算法,可以利用数组的特点快速定位指定索引的元素。堆排序是不稳定的排序方法。辅助空间为O(1).最坏时间复杂度为O(nlog2n)

堆排序的堆序的平均性能较接近于最坏性能

堆排序利用大根堆(或者小根堆)堆顶记录的关键字最大(或者最小)这一特征。使得在当前无序区中选中最大(或者最小)关键字的记录变的简单

(1)最大堆的排序思想

·  1、先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区

   2、再将关键字最大的记录R[1]即堆顶和无序区的最后一个记录R[n]交换。由此得到新的无序区R[1..n-1]和有序区R[n].且满足R[1..n-1].keys <=R[n].key

  3、由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆,然后再次将R[1..n-1]和该区的最后一个记录R[n+1]交换。由此得到新的无序区R[1,n-2]和有序区

   R[1,n-2].keys<=R[n,n-1].keys,同样将R[1..n-2]调整为堆

  直接无序区只有一个元素为止

(2)大根堆排序的基本操作

  1、初始化操作;将R[1.n]构造为初始堆

  2、每一趟排序的基本操作,将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换。然后将新的无序区调整为堆

  注意:

  1、只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序

  2、小根堆排序和大根堆排序类似。只不过排序结果是递减有序的。堆排序和直接选择排序相反。在任何时刻堆排序中无序区总是在有序区之前。且有序区是在原向量的尾部右后往前逐步扩大到整个向量为止。

代码实现

package com.spring.test;

import java.util.zip.DataFormatException;

/**
* 堆排序
*/
public class HeapSortTest {
public static void main(String[] args) {
int[] data5 = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
print(data5);
heapSort(data5);
System.out.println("排序后的数组");
print(data5); } public static void heapSort(int[] data){
for(int i=0;i<data.length;i++){
createMaxdHeap(data,data.length-1-i);
swap(data,0,data.length-1-i);
print(data);
}
} /**
* 交换数据
*/
public static void swap(int[] data,int i,int j){
if(i==j){
return;
}
data[i] = data[i]+data[j];
data[j] = data[i]-data[j];
data[i] = data[i]-data[j];
} /**
* 打印输出
*/
public static void print(int[] data){
for(int i=0;i<data.length;i++){
System.out.print(data[i]+"\t");
}
System.out.println();
} /**
* 大根堆进行判断
*/
public static void createMaxdHeap(int[] data,int lastIndex){
for(int i =(lastIndex-1)/2;i >=0;i--){
//保存当前正在判断的节点
int k = i;
//若当前节点的子节点存在
while(2*k+1 <= lastIndex){
//biggerIndex总是记录较大节点的值,先赋值当前判断节点的左子节点
int biggerIndex = 2*k +1;
if(biggerIndex < lastIndex){
//若右子节点存在,否则此时biggerIndex应该等于lastIndex
if(data[biggerIndex] < data[biggerIndex + 1]){
//若右子节点值比左子节点值大,则biggerIndex记录的是右子节点的值
biggerIndex++;
}
}
if(data[k] < data[biggerIndex]){
/**
* 若当前节点的值比子节点的最大值小,则交换两者的值,,交换后将biggerIndex赋值给K
*
*/
swap(data,k,biggerIndex);
k = biggerIndex;
}else{
break;
}
}
}
} }

排序结果

 

java排序算法(三):堆排序的更多相关文章

  1. Java排序算法之堆排序

    堆的概念: 堆是一种完全二叉树,非叶子结点 i 要满足key[i]>key[i+1]&&key[i]>key[i+2](最大堆) 或者 key[i]<key[i+1] ...

  2. Java排序算法(三):直接插入排序

    [基本思想] 关键:在前面已经排好序的序列中找到合适的插入位置 步骤: 1. 从第一个元素開始,该元素能够觉得已经排好序. 2. 取出下一个元素.在已经排好序的元素序列中从后往前扫描进行比較. 3. ...

  3. Java排序算法(三)

    Java排序算法(三) 三.Java排序算法总结 从这三组时间复杂度对比中,可以看出,堆排序和归并排序是不管在什么情况下发挥稳定的,快速排序好的时候表现如天才,坏情况下比较差强人意,甚至在等待排序个数 ...

  4. Java常见排序算法之堆排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  5. java排序算法(一):概述

    java排序算法(一)概述 排序是程序开发中一种非常常见的操作,对一组任意的数据元素(活记录)经过排序操作后,就可以把它们变成一组按关键字排序的一组有序序列 对一个排序的算法来说,一般从下面三个方面来 ...

  6. Java排序算法(一)

    Java排序算法(一) 排序的基本概念和分类 1.1排序的定义 在<大话数据结构>中,排序定义为,假设含有n个记录的序列为{r1,r2,...,rn},其相应的关键字{k1,k2,..., ...

  7. java排序算法(六):直接插入排序

    java排序算法(六):直接插入排序 直接插入排序的基本操作就是将待的数据元素按其关键字的大小插入到前面的有序序列中 直接插入排序时间效率并不高,如果在最坏的情况下,所有元素的比较次数的总和为(0+1 ...

  8. java排序算法(四):冒泡排序

    java排序算法(四):冒泡排序 冒泡排序是计算机的一种排序方法,它的时间复杂度是o(n^2),虽然不及堆排序.快速排序o(nlogn,底数为2).但是有两个优点 1.编程复杂度很低.很容易写出代码 ...

  9. Java排序算法之快速排序

    Java排序算法之快速排序 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分 ...

随机推荐

  1. hi3531芯片的标识寄存器

    芯片的标识寄存器 0xee0.0xee4.0xee8.0xeec(基址是0x2005_0000) 系统控制器提供了芯片标识(ID)寄存器SC_SYSID.这个标识寄存器是一个概念上 的32bit 的标 ...

  2. 【mysql】mysql基本操作

    mysql基本操作 1.mysql表复制 mysql 表结构的复制 create table t2 like t2 mysql 表数据的复制 insert into t2 select * from ...

  3. No bean named 'hibernateTemplate' is defined

    1.错误描述 WARN:2015-05-01 15:42:22[localhost-startStop-1] - Exception encountered during context initia ...

  4. 堡垒机-teleport的安装以及常见问题解决办法

    teleport是一款简单易用的堡垒机系统,运用在企业对windows.linux服务器的安全使用管理以及审计. 官网网址:http://teleport.eomsoft.net/ github地址: ...

  5. MySQL中information_schema数据库的内容

    大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个information_schema数据库. information_schema数据库是做什么用的呢,使用WordPress博客 ...

  6. 经典面试问题: Top K 之 ---- 海量数据找出现次数最多或,不重复的。

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  7. 多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier

    1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public Count ...

  8. lvs-dr 模式-piranha

    系统: redhat 6.5 mini 机器名 ip vip lvs01(主lvs) 192.168.20.10 192.168.20.254 lvs02(备lvs) 192.168.20.20 rs ...

  9. python urllib和urllib3包使用

    urllib包 urllib是一个包含几个模块来处理请求的库.分别是: urllib.request 发送http请求 urllib.error 处理请求过程中,出现的异常. urllib.parse ...

  10. (luogu P1594)护卫队[TPLY]

    (luogu P1594) 护卫队 题目链接 https://www.luogu.org/problemnew/show/P1594 很好的一个模型 题目大意 有一个有序的车队,要求将其分成若干段,每 ...