排序问题
输入:n个数(a1,a2,a3...)
输入: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);
}
}
}