//堆化子数组publicvoidheapSort03(int[] arr,int N){// 堆化for(int i = N /2-1; i >=0; i--){sift_down(arr, N, i);}// 堆化子数组for(int i = N -1; i >=0; i--){// 交换后,最大的元素原在arr[0],此时末尾元素才是最大,故需要重新堆化子数组[0,n-2]swap(arr, i,0);sift_down(arr, i,0);}}privatevoidsift_down(int[] arr,int N,int k){int t =2* k +1;while(t < N){int r =2* k +2;// 取二孩子的最大者if(r < N && arr[r]> arr[t])
t = r;if(arr[k]>= arr[t])break;swap(arr, k, t);
k = t;}}privatestaticvoid swap (int[] arr,int l,int r){int temp = arr[l];
arr[l]= arr[r];
arr[r]= temp;}