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. VC C运行时库(CRTL)的几个版本及选用

    分类: Windows 2008-12-23 10:01 987人阅读 评论(0) 收藏 举报ciostreammfclibrary多线程import最近做项目碰到了一个关于在动态库中使用MFC以及在 ...

  2. Java实现人民币大写精讲

    想要实现人民币大写,在发票等场景中使用?? 1234.56显示为:壹仟贰佰叁拾肆元伍角陆分,那就往下看看吧! 本程序可以实现 0 到 9999 9999 9999.994 以内的人民币大写转换,精确到 ...

  3. hdu1501Zipper(记忆化搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=1501 搜了下记忆化搜索是嘛 然后就看到这个题了 不过一不小心看到代码了 代码又那么短 一不小心给记住了 然后看了 ...

  4. 根据价格范围筛选汽车(路由以及JS与Jquery)

    通过输入价格范围,来筛选汽车,主要方法是通过点击“查询”按钮,触发chaxun()方法,利用Jquery和JS获取输入的值,然后为相应的div加载相应的动作,通过更改路由的路径,以此来实现筛选车辆,然 ...

  5. MVC——母版与分部

    背景: 母版是因为有一些网站里的很多网页都是采用相同的布局,所以只需要写一个母版,然后在母版该写不同模板的地方加上@RenderBody(),然后创建不同模块的时候只需要创建视图,然后选择母版就可以了 ...

  6. SQL SERVER 2008查询其他数据库

    1.访问本地的其他数据库 --启用Ad Hoc Distributed Queries-- reconfigure reconfigure -- 使用完成后,关闭Ad Hoc Distributed ...

  7. [Rosa]Android ListView 适配器原理及优化(转)

    ListView的Adapter的作用如下图所示:   Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个V ...

  8. linux系统利用yum安装其他软件或服务

    1.下载yum的配置源(最好用网易163的源,也可以使其他的源) wget http://docs.linuxtone.org/soft/lemp/CentOS-Base.repo 下载到 /etc/ ...

  9. By类的使用

     举例,页面上有5个table,每个table都有标题栏和内容栏你觉的我是把每个table的标题都放到List里面遍历使用还是现指定table,在获取table的标题栏使用呢明显后面的方便不容易乱麽所 ...

  10. 【CSS】Intermediate2:Grouping and Nesting

    1.Grouping 2.Nesting If the CSS is structured well, there shouldn’t be a need to use many class or I ...