public class love {
/*建队算法*/
public static void Filterheap(int heap[],int root,int upper){
/*heap为待筛选的堆,root为堆的根结点,upper为无序区的上界*/
int child; //指向孩子结点
int item; //作为过渡变量
int r=root; //r指向根结点
child=2*root+1; //初始时为根结点的左孩子
while(child<upper){
/*比较左右孩子的关键字值,并取大者*/
if(child+1<upper && heap[child+1]>heap[child]){
child=child+1;
}
/*若根结点不满足堆的条件,则与孩子交换*/
if(heap[r]<heap[child]){
item=heap[r];
heap[r]=heap[child];
heap[child]=item;
r=child;
child=2*child+1;
}else break; //若根满足堆的条件,则不交换,并退出筛选
}
}
public static void heapSort(int heap[],int n){
/*heap为待排序序列,n为序列长度*/
int i;
int item;//过渡变量
for(i=(n-2)/2;i>=0;i--){ //从第一个非页结点开始创建初始堆
Filterheap(heap,i,n);
}
for(i=n-1;i>=0;i--){ //做n-1趟排序,每次堆的大小减1
/*将堆顶元素与当前大根堆的最后一个元素交换*/
item=heap[0];
heap[0]=heap[i];
heap[i]=item;
/*筛选,将0~i的元素重新调整*/
Filterheap(heap,0,i);
/*显示排序过程*/
for(int j=0;j<n;j++){
System.out.print(heap[j]+", ");
}
System.out.println();
}
}
public static void main(String[] args) {
/*使用堆排序法进行排序*/
int heap[]=new int[]{9,8,7,6,5,4,3,2,1,10,11,12,13,14,15}; //把待排序的数存放在数组中
int n=heap.length;
heapSort(heap, n);
}
}
java堆排序
猜你喜欢
转载自blog.csdn.net/wuyanan654/article/details/81779749
今日推荐
周排行