堆排序(Heap-Sort)

来源:互联网 发布:淘宝上有部分退款吗 编辑:程序博客网 时间:2024/06/05 19:52
排序问题
输入: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
原创粉丝点击