import org.junit.Test;
public class solution {
@Test
public void testFunc(){
int[] arr = {5,4,3,2,1};
maxHeap(arr);
for(int ele:arr){
System.out.print(ele+" ");
}
}
public void shifDown(int k, int maxIndex, int[] arr){
while(2*k+1<=maxIndex){
int index = 2*k+1;
if (index+1<=maxIndex && arr[index+1]>arr[index]) {
index = index+1;
}
if (arr[k]>arr[index]) {
break;
}
swap(arr, k, index);
k=index;
}
}
private void swap(int[] arr, int i, int j) {
// TODO Auto-generated method stub
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
/*
* 利用最大堆对数组进行排序
*/
public void maxHeap(int[] arr){
if (arr==null || arr.length<=1) {
return;
}
/*
* 从最后一个非叶节点进行shiftDown构建最大堆
*/
int maxIndex = arr.length-1;
for(int i=(maxIndex-1)/2;i>=0;i--){
shifDown(i+1, arr.length-1, arr);
}
/*
* 交换r[0]和r[n],并对r[0]进行shiftDown
*/
swap(arr, 0, maxIndex);
maxIndex--;
while(maxIndex>0){
shifDown(0, maxIndex, arr);
swap(arr, 0, maxIndex);
maxIndex--;
}
}
}
public class solution {
@Test
public void testFunc(){
int[] arr = {5,4,3,2,1};
maxHeap(arr);
for(int ele:arr){
System.out.print(ele+" ");
}
}
public void shifDown(int k, int maxIndex, int[] arr){
while(2*k+1<=maxIndex){
int index = 2*k+1;
if (index+1<=maxIndex && arr[index+1]>arr[index]) {
index = index+1;
}
if (arr[k]>arr[index]) {
break;
}
swap(arr, k, index);
k=index;
}
}
private void swap(int[] arr, int i, int j) {
// TODO Auto-generated method stub
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
/*
* 利用最大堆对数组进行排序
*/
public void maxHeap(int[] arr){
if (arr==null || arr.length<=1) {
return;
}
/*
* 从最后一个非叶节点进行shiftDown构建最大堆
*/
int maxIndex = arr.length-1;
for(int i=(maxIndex-1)/2;i>=0;i--){
shifDown(i+1, arr.length-1, arr);
}
/*
* 交换r[0]和r[n],并对r[0]进行shiftDown
*/
swap(arr, 0, maxIndex);
maxIndex--;
while(maxIndex>0){
shifDown(0, maxIndex, arr);
swap(arr, 0, maxIndex);
maxIndex--;
}
}
}