堆排序算法
package com.cn.gao; //堆排序程序设计 public class HeapSort { public static final int SIZE=10; //堆排序算法 public static void heapSort(int[] a, int n){ int i,j,temp,k; //建大根堆过程 for(i=n/2-1;i>=0;i--){ k = i; while(2*k+1<n){ //如果有孩子节点 j=2*k+1; //i的左孩子 if(j+1<n&&a[j]<a[j+1]){ //保证j所指的为左右孩子中最大的 j++; } if(a[j]>a[k]){ //交换节点的值使其满足堆的性质 temp=a[k]; a[k]=a[j]; a[j]=temp; k=j; //改变了堆的结构,重新调整 }else{ break; } } } //输出建好的堆 System.out.print("建好的堆为:"); for(j=0;j<n;j++){ System.out.print(" "+a[j]); } System.out.println(); //排序调整过程 for(i=n-1;i>0;i--){ temp=a[0]; a[0]=a[i]; a[i]=temp; k=0; while(2*k+1<i){ j=2*k+1; if(j+1<i&&a[j]<a[j+1]){ //保证j所指的为左右孩子中最大的 j++; } if(a[j]>a[k]){ //交换节点的值使其满足堆的性质 temp=a[k]; a[k]=a[j]; a[j]=temp; k=j; //改变了堆的结构,重新调整 }else{ break; } } System.out.print("第"+(n-i)+"次排序后的结果为:"); for(j=0;j<n;j++){ System.out.print(" "+a[j]); } System.out.println(); } } public static void main(String[] args) { int[] a = new int[SIZE]; //为数组赋值 for(int i=0;i<a.length;i++){ a[i] = (int) (100 + Math.random()*100); } //输出排序前的数组 System.out.println("排序前的数组为:"); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println(); //对数组排序 heapSort(a,SIZE); //输出排序后的数组 System.out.println("排序后的数组为:"); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println(); } }