堆排序就是在完全二叉堆的基础上,将堆顶的元素删除,也就是将对顶的元素和堆尾的元素交换,然后重新调整成二叉堆。`‘
package shujujiegou;
import java.util.Arrays;
public class HeapSort {
//下沉调整
public 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]>array[childIndex+1]) {
childIndex++;
}
//如果父节点小于所有的子节点,则跳出循环
if(temp<=array[childIndex]) {
break;
}
//无需正真交换只需要单项赋值
array[parentIndex]=array[childIndex];
parentIndex=childIndex;
childIndex=parentIndex*2+1;
}
array[parentIndex]=temp;
}
public static void heapSort(int[] array) {
//把无序数组构建成二叉堆
for(int i= (array.length-2)/2;i>=0;i--) {
downAdjust(array, i, array.length);
}
//循环删除堆顶元素,移到集合尾部,调整二叉堆
for(int i=array.length-1;i>0;i--) {
int temp=array[i];
array[i]=array[0];
array[0]=temp;
downAdjust(array, 0,i );
}
}
public static void main(String[] args) {
int[] array=new int[] {1,4,23,2,4,65,7,8};
heapSort(array);
System.out.println(Arrays.toString(array));
}
}