二叉堆
堆排序
二叉堆
import java.util.Arrays;
public class HeapOperator {
public static void main(String[] args) {
int[] array0=new int[]{1,3,2,6,5,7,8,9,10,0};
upAdjust(array0);
System.out.println(Arrays.toString(array0));
int[] array=new int[]{7,1,3,10,5,2,8,9,6};
buildHeap(array);
System.out.println(Arrays.toString(array));
}
private static void buildHeap(int[] array) {
for(int i=array.length/2;i>=0;i--){
downAdjust(array,i,array.length-1);
}
}
private static void downAdjust(int[] array, int parentIndex, int length) {
int temp=array[parentIndex];
int childIndex=2*parentIndex+1;
while(childIndex<length){
if(childIndex+1<length&&array[childIndex+1]<array[childIndex]){
childIndex++;
}
if(array[parentIndex]<=array[childIndex]){
break;
}
array[parentIndex]=array[childIndex];
parentIndex=childIndex;
childIndex=childIndex*2+1;
}
array[parentIndex]=temp;
}
private static void upAdjust(int[] array) {
int childIndex=array.length-1;
int parentIndex=(childIndex-1)/2;
int temp=array[childIndex];
while(childIndex>0&&temp<array[parentIndex]){
array[childIndex]=array[parentIndex];
childIndex=parentIndex;
parentIndex=(childIndex-1)/2;
}
array[childIndex]=temp;
}
}
堆排序
import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) {
int[] array2=new int[]{7,1,3,10,5,2,8,9,6};
heapSort(array2);
System.out.println(Arrays.toString(array2));
}
public static void heapSort(int[] array){
for(int i=(array.length-2)/2;i>=0;i--){
downAdjust(array,i,array.length);
}
System.out.println(Arrays.toString(array));
for(int i=array.length-1;i>0;i--){
int temp=array[i];
array[i]=array[0];
array[0]=temp;
downAdjust(array,0,i);
}
}
private static void downAdjust(int[] array, int parentIndex, int length) {
int temp=array[parentIndex];
int childIndex=2*parentIndex+1;
while(childIndex<length){
if(childIndex+1<length&&array[childIndex+1]>array[childIndex]){
childIndex++;
}
if(temp>=array[childIndex]){
break;
}
array[parentIndex]=array[childIndex];
parentIndex=childIndex;
childIndex=childIndex*2+1;
}
array[parentIndex]=temp;
}
}
public static void down(int[] nums,int parentIndex,int len){
int childIndex=parentIndex*2+1;
while(childIndex<len){
if(childIndex+1<len&&nums[childIndex+1]>nums[childIndex]){
childIndex=childIndex+1;
}
if(nums[parentIndex]>=nums[childIndex]){
break;
}
int tmp=nums[childIndex];
nums[childIndex]=nums[parentIndex];
nums[parentIndex]=tmp;
parentIndex=childIndex;
childIndex=childIndex*2;
}
}