堆排序

3人阅读 评论(0) 收藏 举报
分类:

堆排序是指利用二叉树将数据排序,因为是二叉树,所以所在位置为k的节点,其子节点分别在2k和2k+1处,父节点在k/2处(数组0处不存放数据)。进行堆排序,首先是利用下沉或者上浮构造有序堆,即树的根节点是最大值,然后将根节点与数组最后一个数据交换位置,然后再将最大值以前的数据利用下沉或者上浮构造有序堆即根节点最大,然后将之与最大值所在位置的前一个数据与根节点交换,如此循环即可实现数据由小到大排序。

public class Heap {
	public static boolean less(Comparable w, Comparable v)
	{
		return w.compareTo(v) < 0;
	}
	public static void exch(Comparable[] a, int i, int j)
	{
		Comparable temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}
	public static void sink(Comparable[] a, int i, int N)
	{	
		while(2 * i <= N)//至少有一个子节点
		{
			int k = 2 * i;//左子节点
			if(k + 1 <= N)//即有两个子节点
			{
				if(less(a[k], a[k + 1]))//若右子树较大
				{
					k++;//可以只用考虑用k位置的交换即可,即k处的是两个子节点中的较大值
				}	
			}
			if(less(a[i], a[k]))//若根节点小于较大子节点,则交换位置
			{
				exch(a, i, k);
			}
			else break;
			i = k;
		}
	}
	public static void sort(Comparable[] a)
	{
		int N = a.length - 1;//排序的元素个数
		//先建一个有序堆,即根节点最大,因为是二叉树,N/2以后都是叶子节点,所以只需从N/2处考虑下沉即可
		for(int i = N / 2; i >= 1; i--)//构造堆
		{
			sink(a, i, N);
		}
		//进行堆排序,先将最大值与最后一个值交换,再将最大值以前的数据进行堆排序,则最后数组是由小到大
		while(N > 1)
		{
			exch(a, 1, N--);
			sink(a, 1, N);
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] a = {null, "S", "O", "R", "T", "E", "X", "A", "M", "P", "L", "E"};
		sort(a);
		for(int i = 1; i < a.length; i++)
		{
			System.out.print(a[i]);
		}
	}

}

查看评论

几种排序总结(上)——堆排序

堆排序 这几天看了算法导论的排序部分,作一下总结。 堆排序的优点        1)最坏情况下o(nlgn)的时间复杂度        2)就地排序,不用辅助数组 几种操作(以最大堆...
  • lawrencesgj
  • lawrencesgj
  • 2012-10-17 17:17:01
  • 3183

堆排序原理及其实现(C++)

堆排序原理及其实现(C++)1 堆排序的引入 我们知道`简单选择排序`的时间复杂度为O(n^2),熟悉各种排序算法的朋友都知道,这个时间复杂度是很大的,所以怎样减小简单选择排序的时间复杂度呢?从上...
  • yanglr2010
  • yanglr2010
  • 2016-10-18 21:48:02
  • 5412

java堆排序递归代码,无原理版,比较好理解

public class HeapOperate2 { /* * 建立堆时只需要保证根结点小于两个子结点或者大于两个子结点,对两个子结点大小没有要求 */ public static v...
  • zhuqiuhui
  • zhuqiuhui
  • 2016-04-21 23:29:27
  • 1436

堆排序图片详解

堆排序实例 首先,建立初始的堆结构如图: 然后,交换堆顶的元素和最后一个元素,此时最后一个位置作为有序区(有序区显示为黄色),然后进行其他无序区的堆调整,重新得到大顶堆后,...
  • u011068702
  • u011068702
  • 2016-10-09 15:23:27
  • 1497

优化的堆排序

优化的堆排序体现在不需要重新生成一个数组,而是直接原地进行所谓的堆排序。 首先,对于一个杂乱的数组,我们首先对所有的非叶子节点进行shiftdown操作,使得堆顶arr[0]的元素为最大值,如下图所...
  • qq_19782019
  • qq_19782019
  • 2017-11-06 13:42:05
  • 196

堆排序以及其应用大总结

教材上很详细,网上内容也不少,但感觉不够直观、简练、丰富。下面按照自己方式总结下。 提纲: 1)算法描述 2)代码 3)“三围”以及证明(复杂度、效率、稳定性等分析) 4)算法直接应用 5...
  • zhq651
  • zhq651
  • 2012-08-29 01:52:19
  • 10331

堆排序 纯C代码

跟上一篇实现思路一样,感觉还是少出现点幻数比较好,由于heapAdjust()调用频繁,故要尽量提高这段代码的效率 #include #define N 1000 #define INF 99...
  • architect19
  • architect19
  • 2013-05-13 22:44:30
  • 4843

排序算法(七)——堆排序

基本思想 堆排序是一种树形选择排序,是对直接选择排序的改进。   首先,我们来看看什么是堆(heap): (1)堆中某个节点的值总是不大于或不小于其父节点的值; (2)堆总是一棵完全二叉树(Compl...
  • u012152619
  • u012152619
  • 2015-08-13 08:39:32
  • 15384

【数据结构与算法】内部排序之三:堆排序(含完整源码)

堆排序、快速排序、归并排序(下篇会写这两种排序算法)的平均时间复杂度都为O(n*logn)。要弄清楚堆排序,就要先了解下二叉堆这种数据结构。本文不打算完全讲述二叉堆的所有操作,而是着重讲述堆排序中要用...
  • mmc_maodun
  • mmc_maodun
  • 2014-03-04 00:01:45
  • 23553

堆排序(基本思想以及算法实现)

1、引言 简单选择排序算法是通过比较,确定最终的位置。假设未排序的元素个数为N,则遍历一趟,需要比较N-1次,再遍历下一趟时,需比较N-2次。但是,第二次的比较是完全独立的,没有利用第一次比较的信息...
  • u012549515
  • u012549515
  • 2013-10-30 15:20:32
  • 1786
    个人资料
    等级:
    访问量: 416
    积分: 109
    排名: 125万+
    文章分类
    文章存档