import java.util.Scanner;

 /*堆是一种数据结构,类似于一棵完整的二叉树。
* 思想:堆的根节点值最大(最小),将无序序列调整成一个堆,就能找出这个序列的最大值(最小值),将找出的值交换到序列的最后或最前,
* 这样有序序列元素增加1个,无序序列元素减少1个,对新的无序序列重复这样的操作,就实现了排序。即:1.建堆2.排序
* 对排序过程(大顶堆):
* (1)从无序序列所确定的完全二叉树的第一个非叶子节点(n/2)开始,从右到左,从下到上,对每个节点进行调整,最终的到大顶堆
* 对节点的调整方法:将当前节点(a)的值与其孩子节点进行比较,如果存在大于a的孩子节点,从中选出最大的的一个和a进行交换,当
* a到下一层时重复上述过程,直到a的孩子节点值都小于a为止
* (2)将当前无序序列的第一个元素(a),即树的根节点与当前无序序列的最后一个元素(b)交换。a进入有序序列,达到最终位置。
* 无序序列中元素减少1个,有序序列中元素增加1个,此时只有节点b不满足堆定义,对它进行调整
* (3)重复(2)中过程,直到无序序列中的元素剩下一个时排序结束
** 时间复杂度O(nlog2(n))[2是底]
** 空间复杂度O(1)*/
/*适合记录多的排序*/
/*将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间的内在关系.*/
public class heapsort { public static void main(String[] args){
Scanner cin = new Scanner(System.in);
String str = cin.nextLine();
String[] st = str.split(" ");
int[] c = new int[st.length+1];
for(int i=0;i<st.length;i++){
c[i+1]=Integer.parseInt(st[i]);
}
sort(c);
for(int i=1;i<c.length;i++){
System.out.print(c[i]);
System.out.print(" ");
} cin.close();
}
//完成R[low]到R[high]范围内对low的调整
//默认R是一个完全二叉树的顺序存储
public static void sift(int[] R,int low,int high){
int i=low,j=i*2;
int temp = R[i];;
while(j<=high){
if(j<high&&R[j]<R[j+1]){
j++;
}
if(temp<R[j]){
R[i]=R[j];
i=j;
j=2*i;
}else{
break;
}
}
R[i]=temp;
}
//堆排序
public static void sort(int[] R){
int i,j;
int n = R.length-1;
int temp;
for(i=n/2;i>=1;--i){//初始化(大根)堆
sift(R,i,n);
}
//堆排序
for(j=n;j>=2;j--){
temp=R[1];
R[1]=R[j];
R[j]=temp;
sift(R,1,j-1);
}
}
}

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

  1. Java实现堆排序和计数排序

    堆排序代码: 思想:每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最小堆,依次类推,最终得到排序的序列. import java.util.Arrays; /** * 思路:首先要 ...

  2. Java实现---堆排序 Heap Sort

    堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关 ...

  3. Java实现堆排序(大根堆)

    堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间的内在关系,在当前无序区中选择关键 ...

  4. Java实现堆排序问题(变治法)

    问题描述 用基于变治法的堆排序算法对任意一组给定的数据进行排序 2.1 堆排序原理简介 堆可以定义为一颗二叉树,树的节点中包含键(每个节点是一个键),并且满足下面两个条件: (1)树的形状要求--这颗 ...

  5. Java算法-堆排序

    package org.rut.util.algorithm.support; import org.rut.util.algorithm.SortUtil; public class HeapSor ...

  6. java基础之:堆排序

    最近做题目饱受打击,愈发觉得打好基础的重要性,于是乎,决心把基本的排序算法还有数组操作一一实现,目的在于一方面能够得到对JAVA基础的巩固,另一面在实现的过程中发现不足. 今天所实现的堆排序(最大堆) ...

  7. Java实现各种内部排序算法

    数据结构中常见的内部排序算法: 插入排序:直接插入排序.折半插入排序.希尔排序 交换排序:冒泡排序.快速排序 选择排序:简单选择排序.堆排序 归并排序.基数排序.计数排序 直接插入排序: 思想:每次将 ...

  8. 常用算法之排序(Java)

    一.常用算法(Java实现) 1.选择排序(初级算法) 原理:有N个数据则外循环就遍历N次并进行N次交换.内循环实现将外循环当前的索引i元素与索引大于i的所有元素进行比较找到最小元素索引,然后外循环进 ...

  9. java 实现大顶堆

    Java实现堆排序(大根堆)   堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间 ...

随机推荐

  1. WCF - Self Hosting

    WCF - Self Hosting Here, the WCF service is hosted in a console application. Given below is the proc ...

  2. Eclipse Mars: How to Stop Updating Error Reporting Database

    Eclipse Mars: How to Stop Updating Error Reporting Database I was using Eclise Mars version IDE.. Ev ...

  3. maven 简单实用教程

    1. Maven介绍 1.1. 简介 java编写的用于构建系统的自动化工具. 目前版本是2.0.9,注意maven2和maven1有很大区别,阅读第三方文档时需要区分版本. 1.2. Maven资源 ...

  4. POI导出数据内存溢出问题

    POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好.3.8版本的POI新出来了SXSSFWorkbook,可以支持大数据量的操作,只是SXSSFWo ...

  5. MySQL 内存监控

    上一篇blog介绍了因为sql查询information_schema表而导致内存暴涨的case. 今天顺便做了一个thd内存的监控: 先来介绍下MySQL的内存: 1. 线程内内存:thd-> ...

  6. Android的string-array数据源简单使用

    在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子如下: 把相应的数据放到values文件夹的arrays.xml文件里 <?xml version= ...

  7. oracle的exp、imp命令

    1.EXP a>完全模式 full=y EXP USER/PASSWORD@DB (AS ROLE) BUFFER=64000 FILE=C:\FULL.DMP FULL=Y b>用户模式 ...

  8. Vlan技术总结

    VLAN主要有两个作用: vlan可以有效的控制广播域的范围 vlan可以分组设备,增强局域网的安全性(业务隔离) vlan的范围: 一共有4096个vlan,vlan 1为默认vlan.但其中vla ...

  9. spring--JDBC的支持--7

    7.1  概述 7.1.1  JDBC回顾 传统应用程序开发中,进行JDBC编程是相当痛苦的,如下所示: java代码: 以上代码片段具有冗长.重复.容易忘记某一步骤从而导致出错.显示控制事务.显示处 ...

  10. BILL.WEI]stimulsoft reports 中panel 妙用

    我们在通过stimulsoft reports做报表,有的时候,我们需要通过合并报表的一些中间列元素,我们就可以用到panel组件 如下图,我们需要合并报表中间项,一般手段达不到要求,只能通过嵌套pa ...