堆排序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实现

  • 2017年07月27日 17:03
  • 4KB
  • 下载

堆排序算法Java面向对象实现源码

  • 2017年11月25日 10:13
  • 682KB
  • 下载

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

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

堆排序 java实现

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

Java实现堆排序

  • 2017年12月05日 17:29
  • 2KB
  • 下载

Java实现堆的封装,进行插入,调整,删除堆顶以完成堆排序实例

简介堆对于排序算法是一个比较常用的数据结构,下面我就使用Java语言来实现这一算法首先,我们需要知道堆的数据结构的形式,其实就是一个特殊的二叉树。但是这个二叉树有一定的特点,除了是完全二叉树以外,对于...

堆排序,和其他排序 java 实现

  • 2012年05月21日 13:41
  • 52KB
  • 下载

堆排序原理详解和Java实现代码

当面试的时候被问到,你对堆有没有做过一些了解?? 当时我我反问了一下:您是指堆数据结构还是JVM里面存储对象等信息的堆时?? 当时感觉自己还挺高端的,居然可以反问,但是当面试官说是堆排序的时候我就...

堆排序(java 语言实现)

可以用 数组或者线性表实现 Heap ,关键是理清楚 当前节点的坐标和父节点的坐标以及左右孩子的坐标的关系,比如 当前坐标是 i 其他节点的坐标如何表示。然后就是添加删除的原则。package co...
  • stuShan
  • stuShan
  • 2016年04月22日 11:16
  • 194

Java实现堆排序(大根堆)

堆排序是一种树形选择排序方法。设长度为n的一组数用堆来排序,首先用数组存储这组数。堆排序的特点是:在排序的过程中,array[0,…,n-1]可看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:堆排序java实现
举报原因:
原因补充:

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