数据结构之顺序村村存储二叉树遍历及堆排序

//大顶堆即是二叉数的节点越低他的值越大,假如节点的位置是i,他的左叶子节点是2*i+1,右叶子节点是2*i+2
static
int[] arr=new int[]{3,5,2,5,67,7,3,8}; public static void frontShow(int index){ if(arr==null||arr.length==0){ return; } System.out.println(arr[index]); //查询左节点2N+1 if(2*index+1<=arr.length-1){ frontShow(2*index+1); } //查询右节点 if(2*index+2<=arr.length-1){ frontShow(2*index+2); } } public static void maxHeap(int[]arr, int size,int index){ int leftIndex=2*index+1; int rightIndex=2*index+2; int max=index; if(leftIndex<size&&arr[max]<arr[leftIndex]){ max=leftIndex; } if(rightIndex<size&&arr[max]<arr[rightIndex]){ max=rightIndex; } if(max!=index){ arr[max]=arr[max]^arr[index]; arr[index]=arr[max]^arr[index]; arr[max]=arr[max]^arr[index];
//重新调整前面的节点为大顶堆 maxHeap(arr,size,max); } }
public static void heapSort(int ... arr){
//计算最后叶子节点的父节点位置
int index=(arr.length-1)/2;
//调整为大顶堆
for(int i=index;i>=0;i--){ maxHeap(arr,arr.length,i); }
//将降序改为升序 /**
for(int i=arr.length-1;i>=0;i--){ if(arr[0]>arr[i]){ arr[0]=arr[i]^arr[0]; arr[i]=arr[0]^arr[i]; arr[0]=arr[i]^arr[0]; } maxHeap(arr,i,0); }
**/ }
public static void main(String[] args) { frontShow(0); heapSort(arr); System.out.println(Arrays.toString(arr)); }

 

posted @ 2020-03-30 11:07  sunjinwei123  阅读(138)  评论(0)    收藏  举报