堆排序是利用二叉树的原理进行排序,所以又称之为二叉树排序。树中任意一非叶节点的关键字均不大于或不小于其左右孩子节点的关键字。
堆排序原理:利用最大堆或是最小堆特点,先将数组生成一个最大堆或最小堆的二叉树,再将关键字的堆顶与无序区的最后一个节点进行位置互换。多次循环,保证其节点都比其孩子节点的数值大或者小。
代买实现:
public class Test{
public static void main(String[] args){
int[] arr = {1,5,3,4,8,2,6,7};
for(int i = arr.length/2 - 1; i > 0; i--){ //对数组进行建堆操作,就是从最后一个非叶结点进行筛选的过程
paixu(arr,i,arr.length-1);
}
for(int i = arr.length-1; i > 0; i--){ //将该大顶堆 的堆顶与堆尾互换位置
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
paixu(arr,0,i-1);
}
for(int i:arr){ //遍历输出数组
Sysout.print(i+" ");
}
}
public static void paixu(int[] arr, int i, int len){
int temp = arr[i]; //i为最后的一个非叶子结点 即有子结点的结点
for(int j = 2*i; j < len; j *=2){
if(i < len && arr[j] < arr[j+1]){
++j; //值较大的数组小标
}
if(temp >= arr[j]){
breack;
}
arr[i] = arr[j]; //将此值 上移到父节点
i=j;
}
arr[i] = temp; //要放入的位置
}
}