1 import java.util.Scanner; 2 3 /*堆是一种数据结构,类似于一棵完整的二叉树。 4 * 思想:堆的根节点值最大(最小),将无序序列调整成一个堆,就能找出这个序列的最大值(最小值),将找出的值交换到序列的最后或最前, 5 * 这样有序序列元素增加1个,无序序列元素减少1个,对新的无序序列重复这样的操作,就实现了排序。即:1.建堆2.排序 6 * 对排序过程(大顶堆): 7 * (1)从无序序列所确定的完全二叉树的第一个非叶子节点(n/2)开始,从右到左,从下到上,对每个节点进行调整,最终的到大顶堆 8 * 对节点的调整方法:将当前节点(a)的值与其孩子节点进行比较,如果存在大于a的孩子节点,从中选出最大的的一个和a进行交换,当 9 * a到下一层时重复上述过程,直到a的孩子节点值都小于a为止 10 * (2)将当前无序序列的第一个元素(a),即树的根节点与当前无序序列的最后一个元素(b)交换。a进入有序序列,达到最终位置。 11 * 无序序列中元素减少1个,有序序列中元素增加1个,此时只有节点b不满足堆定义,对它进行调整 12 * (3)重复(2)中过程,直到无序序列中的元素剩下一个时排序结束 13 ** 时间复杂度O(nlog2(n))[2是底] 14 ** 空间复杂度O(1)*/ 15 /*适合记录多的排序*/ 16 /*将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间的内在关系.*/ 17 public class heapsort { 18 19 public static void main(String[] args){ 20 Scanner cin = new Scanner(System.in); 21 String str = cin.nextLine(); 22 String[] st = str.split(" "); 23 int[] c = new int[st.length+1]; 24 for(int i=0;i<st.length;i++){ 25 c[i+1]=Integer.parseInt(st[i]); 26 } 27 sort(c); 28 for(int i=1;i<c.length;i++){ 29 System.out.print(c[i]); 30 System.out.print(" "); 31 } 32 33 cin.close(); 34 } 35 //完成R[low]到R[high]范围内对low的调整 36 //默认R是一个完全二叉树的顺序存储 37 public static void sift(int[] R,int low,int high){ 38 int i=low,j=i*2; 39 int temp = R[i];; 40 while(j<=high){ 41 if(j<high&&R[j]<R[j+1]){ 42 j++; 43 } 44 if(temp<R[j]){ 45 R[i]=R[j]; 46 i=j; 47 j=2*i; 48 }else{ 49 break; 50 } 51 } 52 R[i]=temp; 53 } 54 //堆排序 55 public static void sort(int[] R){ 56 int i,j; 57 int n = R.length-1; 58 int temp; 59 for(i=n/2;i>=1;--i){//初始化(大根)堆 60 sift(R,i,n); 61 } 62 //堆排序 63 for(j=n;j>=2;j--){ 64 temp=R[1]; 65 R[1]=R[j]; 66 R[j]=temp; 67 sift(R,1,j-1); 68 } 69 } 70 }