public class HeapSort {
/**
* 调整aaray[parent,end]范围为最大堆
* @param array
* @param parent
* @param end
*/
public static void heapAdjust(int[] array,int parent,int end){
int left = parent*2+1;//左节点
int temp = array[parent];
while(left<=end){
if(left+1<=end && array[left+1]>array[left])
left=left+1;
if(temp<array[left]){
array[parent]=array[left];
}else{
//已经是最大堆,其子树必然是最大推,因为是从下往上调整的
break;
}
//如果发生了交换的话,要继续调整下面的推,维持下面的堆仍旧是最大堆
parent=left;
left=left*2+1;
}
array[parent]=temp; //确定根结点在当前堆的位置
}
public static void heapSort(int[] array){
//创建初始堆
for(int i=array.length/2-1;i>=0;i--){
//从最后一个非叶子结点开始调整堆,从下往上逐步形成最大堆
heapAdjust(array, i, array.length-1);
}
int temp=0;
for(int i=array.length-1;i>0;i--){
//与最后一个互换
temp = array[i];
array[i]=array[0];
array[0]=temp;
//调整堆,此时堆的调整范围为[0,i-1]
heapAdjust(array, 0, i-1);
}
}
public static void main(String[] args) {
int[] array = new int [10];
for(int i=0;i<10;i++){
array[i]=(int)(Math.random()*10);
}
System.out.println(Arrays.toString(array));
heapSort(array);
System.out.println(Arrays.toString(array));
}
}
1.堆排序java实现
猜你喜欢
转载自blog.csdn.net/cl723401/article/details/88100835
今日推荐
周排行