堆排序(Heap-Sort)

排序问题
输入:n个数(a1,a2,a3...)

输出:输入序列的一个重排列(a1',a2',a3'...),使得a1'>=a2'>=a3'....

堆排序基本过程:(1)最大堆,即父节点值大于子节点,那么对于最小节点数的堆(即三个节点)实现最大堆建立的办法即分别比较父节点与子节点,将较大者放在父节点位置;(2)对最初数组建立最大堆即从叶子节点开始倒序调用最大堆方法;(3)最大堆建立成功后,则进行头尾交换即data[i]与data[length]进行交换,然后从根节点运行最大堆方法,则完成堆排序过程。

import java.util.*;
public class HeapSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        int myData[];
        System.out.println("请输入需要排列的数字,并以空额间隔(例如2 9 10.。。):");
        Scanner input = new Scanner(System.in);
        String tempStr = input.nextLine();
        input.close();
        String str[] = tempStr.split(" ");
        myData = new int[str.length+1];
        for(int i=1;i<=str.length;i++)
        {
        	myData[i]=Integer.parseInt(str[i-1]);
        }
        
        HeapSort myHeapSort = new HeapSort();
        myHeapSort.SortHeap(myData);
        
        for(int i=1;i<myData.length;i++)
        	System.out.print(myData[i]+" ");
        System.out.println();
	}
	
	private void SortHeap(int[] tempData)
	{
		BuildHeap(tempData);
		for(int i=tempData.length-1;i>1;i--)
		{
			int tempInt=tempData[1];
			tempData[1]=tempData[i];
			tempData[i]=tempInt;
			MaxHeap(tempData,1,i-1);
		}
	}
	
	private void BuildHeap(int[] tempData)
	{
		for(int i=tempData.length/2;i>0;i--)
		{
			MaxHeap(tempData,i,tempData.length-1);
		}
	}
	
	
	private void MaxHeap(int[] tempData,int local,int len)
	{
		int m=2*local,n=2*local+1,lager=local;
		if(m<=len)
		{
			if(tempData[m]>tempData[lager])
				lager=m;
		}
		if(n<=len)
		{
			if(tempData[n]>tempData[lager])
				lager=n;
		}
		if(lager!=local)
		{
			int tempInt=tempData[lager];
			tempData[lager]=tempData[local];
			tempData[local]=tempInt;
			MaxHeap(tempData,lager,len);
		}
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值