//面去哪儿网的时候,叫写个堆排序结果没写出来,直接就挂了,都是泪,第一次写博客记录,就从这个开始吧,(反正也没人看,就自己回忆着用)
//堆排序:堆分大堆和小堆,是完全二叉树,大堆即父节点大于左右子节点
private int size;
private void heapSort(int[] num)
{
this.size = num.length;
/**
* 建堆,堆是由数组实现的,i从size/2,开始是因为要从最后一个节点的子节点开始下滤
*/
System.out.println(size);
for(int i = size/2; i >= 0; i--)
{
percDown(num,i,size);
}
for(int i = size - 1; i > 0; i--)
{
//将根节点移动堆的最后一个节点中,就是deleteMin(deleteMax)的过程
swap(num,0,i);
percDown(num,0,i);
}
for(int i = size - 1; i >= 0; i--)
{
System.out.println(num[i]);
}
}
// 交换第一个和最后一个元素
private void swap(int[] num, int a, int b)
{
int tmp = num[a];
num[a] = num[b];
num[b] = tmp;
return;
}
private void percDown(int[] num, int i, int n)
{
int child;
int tmp;
int index = i;
for(tmp = num[index] ; 2 * index < n; index = child)
{
child = 2 * index;
// 找到子节点中较小的元素,保证不是最后一个元素,因为最后一个被交换后,是最小元素
if(num[child] > num[child + 1] && child != n - 1)
{
child++;
}
/*
*第一个元素(一直都是用第一元素比较)依次和其子节点比较,比它小,则将
*child(子节点)的值赋给index(父节点)(将子节点向上层移动), 这一点很重要!!!
*直到最后一个
**/
if(num[child] < tmp)
{
num[index] = num[child];
}
else
{
break;
}
}
num[index] = tmp;
}