您的位置:首页 > 编程语言 > Java开发

《算法导论》学习心得(四)—— 堆排序(Java)

2014-11-08 09:23 477 查看
堆排序是一种很常见的排序方法,它的思想是利用数据结构--堆。具体的实现细节:

1. 构建一个最大堆。对于给定的包含有n个元素的数组A
,构建一个最大堆(最大堆的特性是,某个节点的值最多和其父节点的值一样大。这样,堆中的最大元素存放在根节点中;并且,在以某一个节点为根的子树中,各节点的值都不大于该子树根节点的值)。从最底下的子树开始,调整这个堆结构,使其满足最大堆的特性。当为了满足最大堆特性时,堆结构发生变化,此时递归调整对应的子树。

2. 堆排序算法,每次取出该最大堆的根节点(因为根节点是最大的),同时,取最末尾的叶子节点来作为根节点,从此根节点开始调整堆,使其满足最大堆的特性。

3. 重复上一步操作,直到堆的大小由n个元素降到2个。如图所示http://upload.wikimedia.org/wikipedia/commons/4/4d/Heapsort-example.gif



<pre name="code" class="java">package com.tangbo;

import java.util.Random;
import java.util.Scanner;

public class HeapSort {
	static Scanner scanner;
	static Random random = new Random();
	public static void main(String[] args) {
		print(heapSort(buidMaxHeap(productArray())));//生成数组,建堆,堆排序,打印
	}
	static void print(int []array)//打印函数
	{
		for(int i=0;i<array.length;i++)
		{
			System.out.print(array[i]+" ");
		}
		System.out.println();
	}
	static int [] productArray()//生成一个数组
	{
		int arrayayLength=0;
		System.out.println("请输入数组长度:");
		scanner = new Scanner(System.in);
		arrayayLength = scanner.nextInt();
		int [] arrayayTemp = new int[arrayayLength];
		for (int i = 0; i < arrayayLength; i++) {
			arrayayTemp[i]=random.nextInt(1000);
		}
		return arrayayTemp;
	}
	static int[] heapSort(int [] array)//堆排序
	{
		int tempValue=0;
		int arrayLength = array.length;
		for(int i=arrayLength-1;i>=0;i--)
		{
			tempValue = array[i];
			array[i] = array[0];
			array[0] = tempValue;
			maxHeapify(array,0,i);
		}
		return array;
	}
	static int [] buidMaxHeap(int [] array)//健最大堆
	{
		int arrayLength = array.length;
		for(int i=array.length/2-1;i>=0;i--)
		{
			maxHeapify(array, i,arrayLength);
		}
		return array;
	}
	
	static int [] maxHeapify(int [] array,int i,int heapSize)//堆维护
	{
		int leftIndex,rightIndex,largest,tempValue;
		leftIndex = 2*i+1;
		rightIndex = 2*i+2;
		if(leftIndex<heapSize && array[leftIndex]>array[i])
		{
			largest = leftIndex;
		}else
		{
			largest = i;
		}
		if(rightIndex<heapSize && array[rightIndex]>array[largest])
		{
			largest = rightIndex;
		}
		if(largest!=i)
		{
			tempValue = array[largest];//交换
			array[largest] = array[i];
			array[i] = tempValue;
			maxHeapify(array, largest,heapSize);//维护下一个
		}
		return array;
	}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: