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

堆排序 java实现

堆排序-java实现

/** * 堆排序:大堆排序 1:建立大堆排序->根据公式 父节点为 i 左节点为2*i+1;右节点为:2*i+2; * 我们要进行大堆排序需要根据数组元素个数找到最后节点的父节点,从这个父节点往上进...

堆排序的Java实现

public class Main { public static void main(String[] args) { int[] arr = {16,7,3,20,17,8}...

堆排序的java简单实现以及讲解

堆排序:首先我们需要将数组调整为堆排序的结构,就是保证每个节点的值大于其左节点(2i+1),右节点(2i+2),复杂度为o(n)。之后,我们删除堆顶,复杂度为o(nlogn)。 代码如下: pub...

堆排序--Java实现

package com.shusheng.heapSort;/** * 实现堆排序 * @author Administrator * */ public class HeapSort { ...

堆排序算法(java实现)

一、基本概念 要掌握堆排序,先要了解堆这种数据结构。 堆是一个近似完全二叉树的结构,其任意节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的键...

堆排序算法java实现

学排序有一段时间了,对排序算法有一些理解,花时间学习了一下,现在写出自己对堆排序的见解和简单实现。 堆排序简单来说可以概括为三个步骤: 1.根据数据建立无序的堆 2.对堆按大顶堆或小顶堆...

Java数据结构——堆排序实现

package 排序; public class 堆排序 { public static void main(String[] args) { int[] array = {3,1,5,7,2...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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