标签:
/* ***********完完整整的用堆排序来对一个序列进行排序 ************ * */ import java.util.Random; public class HeapSort { public static void main(String args[]){ int[] a = new int[1050]; InitList(a);//初始化 PrintList(a);//打印随机生成的序列
System.out.println();//打印一行空格,区分排序前还是排序后
new HeapSort().Heap_Sort(a); PrintList(a);//打印排序之后的序列 } /* ********************HeapSort****************** * */ public void Heap_Sort(int a[]){ int length = a.length; //建造一个堆 CreatHeap(a,length); for(int i = length ; i > 0 ; i-- ){ //把最小的放到最后边,然后重新构造小顶堆 int temp = a[0]; a[0] = a[i-1]; a[i-1] = temp; CreatHeap(a,i-1); } } /* ********************构造小顶堆********************* * */ public void CreatHeap(int a[],int length){ //从最后一个非叶节点开始,一个个逐渐向前调整来构造一个小顶堆 for(int i = length/2 ; i >=0 ; i--){ HeapAdjust(a,i,length); } } /* ************************调整小顶堆 ************************ * */ public void HeapAdjust(int a[],int pos,int length){ //pos为待调整节点,leftChild为待调整节点的左孩子,rightChild为带调整节点的右孩子 int leftChild = pos*2; int rightChild = pos*2+1; int min = pos; if(leftChild<length && a[leftChild]<a[min]){ min = leftChild; } if(rightChild<length && a[rightChild]<a[min]){ min = rightChild; } if(min !=pos){// 调整当前节点,若有比当前节点小的节点,则交换 int temp = a[pos]; a[pos] = a[min]; a[min] = temp; //交换后的节点可能会不满足小顶堆,则递归调整交换后的节点 //若min==pos,即上述交换过程没发生,则也不会执行次递归调整的过程 HeapAdjust(a,min,length); } //调整当前节点的孩子节点 } public static void InitList(int[] a){ Random intr = new Random(); for(int i = 0 ; i < a.length ; i ++){ a[i] =intr.nextInt(1000); } } public static void PrintList(int[] a){ for(int i = 0 ; i < a.length ; i ++){ System.out.print(a[i]+ " "); } } }
标签:
原文地址:http://www.cnblogs.com/ooon/p/4450940.html