public class HeapOperation {
/*
* 建立堆时只需要保证根结点小于两个子结点或者大于两个子结点,对两个子结点大小没有要求
*/
public static void main(String[] args) {
int index;
// int[] arr={-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] arr={9,8,7,6,5,4,3,2,1,0,-1,-2,-3};
show(arr);
heap_sort(arr,13);
show(arr);
}
public static void show(int[] arr){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
public static void heap_sort(int[] arr,int len){
int p;
int end;
for(p=(len-1-1)/2;p>=0;p--){
adjustDown(arr,p,len-1);
}
for(end=len-1;end>=1;end--){
swap(arr,0,end);
adjustDown(arr, 0, end-1);
}
}
public static void adjustDown(int[] arr,int i,int end){
int key=arr[i];
int p=i;
//TODO
int left=2*p+1;
//越界就是没有孩子 只要能进循环就一定是有孩子的
while(left<=end){
//有右孩子的情况下,大于等于左右孩子不用换
if((key>=arr[left])&&(left+1<=end&&key>=arr[left+1])){
break;
}else if(key>=arr[left]&&left+1>end){//没有右孩子,只有左孩子,且大于等于左孩子不用换
break;
}else if(left+1<=end &&arr[left+1]>=arr[left]&&key<arr[left+1]){
swap(arr,p,left+1);//与右孩子换。要保证有右孩子,且右孩子大于等于左孩子,父亲小于右孩子
p=left+1;
left=2*p+1;
}else if(left+1<=end &&arr[left]>arr[left+1]&&key<arr[left]){
swap(arr,p,left);
p=left;//父亲与谁换,就到谁的位置了
left=2*p+1;//父亲新的左孩子的位置
}else if(left+1>end&&arr[left]>key){
swap(arr,p,left);//与左孩子换。没右孩子的情况下,只需父亲小于左孩子
p=left;
left=2*p+1;
}
}
}
public static void swap(int[] arr,int p,int q){
int temp=arr[p];
arr[p]=arr[q];
arr[q]=temp;
}
}
对排序非递归实现 java
最新推荐文章于 2024-07-12 22:29:04 发布