堆排序java实现

转载 2015年06月06日 15:01:03
/**
 * 升序用大根堆,降序用小根堆
 * 调整堆:从根节点开始向下调整堆
 * ①先建立初始堆,从n/2-1(第一个非叶子节点)节点开始,将之看做根节点,向下调整堆,到根节点结束
 * ②循环i from n-1 to 0,每次取出堆的最顶层根节点,即数组下标为0,然后与节点i交换,这样对于大根堆而言,最大值总是在后面,再从根节点开始调整堆
 */
public class HeapSort {

	public static void main(String[] args) {
		int[] a = { 26, 5, 77, 1, 61, 11, 59, 15, 48, 19 };
		Sort(a);
	}
	//heapSort
	public static void Sort(int[] a) {
		int n = a.length;//取得数组总长度,及堆最大的序号
		int temp = 0;

		Display(a, "Before sort : ");
		for (int i = n / 2 - 1; i >= 0; i--) {
			Adjust(a, i, n);
			Display(a, "create MaxHeap : ");
		}
		System.out.println("---------------------------------------");
		for (int i = n - 2; i >= 0; i--) {
			temp = a[i + 1];//取出最后一个元素
			a[i + 1] = a[0];//取出第一个元素,即顶层根节点
			a[0] = temp;//交换位置

			Adjust(a, 0, i + 1);//调整堆
			Display(a, "reCreate : ");
		}

		Display(a, "After  sort : ");
	}
	/**
	 * 调整堆的方法
	 * @param a 要调整的数组,即堆
	 * @param i 调整的根节点,即起始位置
	 * @param n 要调整的终止位置
	 */
	public static void Adjust(int[] a, int i, int n) {
		int j = 0;
		int temp = 0;

		temp = a[i]; //取出根节点
		j = 2 * i + 1;  //左孩子节点

		while (j <= n - 1) {
			if (j < n - 1 && a[j] < a[j + 1])//比较左右孩子,取出较大的孩子
				j++;

			if (temp >= a[j]) //如果根节点大于孩子节点则退出循环,不用调整
				break;

			a[(j - 1) / 2] = a[j];//较大的孩子节点值赋值给根节点

			j = 2 * j + 1;//继续寻找左孩子
		}

		a[(j - 1) / 2] = temp;//将根节点赋值给最后一个空出来的节点
	}
	//打印堆内容
	public static void Display(int[] a, String str) {
		System.out.println(str);

		for (int i = 0; i < a.length; i++)
			System.out.print(a[i] + " ");

		System.out.println();
	}

}

算法(第四版)学习笔记之java实现堆排序

继上一篇实现基于堆的优先队列后,这次将利用上一次完成的基于堆的能够重复删除最大元素操作的优先队列来实现一种经典而优雅的排序算法,称之为堆排序。 堆排序可分为两个阶段: 1.构建堆:在堆的构建过程中...
  • l243225530
  • l243225530
  • 2015-07-26 16:02:37
  • 1238

【排序算法】堆排序原理及Java实现

1、基本思想堆是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一颗完全二叉树,根结点的值小于(或大于)两个子节点的值,同时,根节点的两个子树也分别是一个堆。 堆排序就是利用堆(...
  • jianyuerensheng
  • jianyuerensheng
  • 2016-04-27 18:34:23
  • 13106

基本算法_堆排序_Java实现

堆排序就是将序列调整为指定的堆,然后调整首尾元素的位置,取出末尾元素,反复进行,直到将所有元素取出,形成一个有序的序列。...
  • ljmingcom304
  • ljmingcom304
  • 2015-12-22 14:14:42
  • 2390

堆排序(Heapsort)之Java实现

堆排序算法介绍 堆是一种重要的数据结构,为一棵完全二叉树, 底层如果用数组存储数据的话,假设某个元素为序号为i(Java数组从0开始,i为0到n-1), 如果它有左子树,那么左子树的位置是2i+1,如...
  • kimylrong
  • kimylrong
  • 2013-12-05 22:25:31
  • 54751

HeapSort堆排序Java实现图文代码详解

堆排序(Heapsort)堆积树设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。 排序图如下:(gif来自维基百科) 堆排序的过程就是首先构建大根堆,然后对顶元素(及最大元素)与最...
  • wg1033755123
  • wg1033755123
  • 2015-04-12 14:04:13
  • 1050

堆排序 java实现

  • 2011年10月24日 15:11
  • 1KB
  • 下载

java编程题:用Java实现一个堆排序算法

import java.util.Arrays; /** * java编程题:用Java实现一个堆排序算法 */ public class Test21 { public stati...
  • min996358312
  • min996358312
  • 2017-03-29 19:11:07
  • 280

java实现算法之堆排序

本文参考文章:http://blog.csdn.net/morewindows/article/details/6709644 堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常...
  • Rebirth_Love
  • Rebirth_Love
  • 2016-05-08 19:18:41
  • 928

【java面试】算法篇之堆排序

一、堆的概念 堆是一棵顺序存储的完全二叉树。完全二叉树中所有非终端节点的值均不大于(或不小于)其左、右孩子节点的值。 其中每个节点的值小于等于其左、右孩子的值,这样的堆称为小根堆; 其中每个节点的值大...
  • qq_21492635
  • qq_21492635
  • 2017-06-12 14:23:38
  • 3417
收藏助手
不良信息举报
您举报文章:堆排序java实现
举报原因:
原因补充:

(最多只允许输入30个字)