package algorithm;
/**
* @author Administrator
*堆排序算法
*思路:把数组看成一个二叉树,其中任意子节点的数总比他的孩子小,这种叫做小顶堆
* 父亲节点比孩子节点的大的叫做大顶堆
* 首先每次初始化顶堆,使得第一个数是最小的一个,然后把最小的和最后一个对调,
* 重新对数组进行小顶堆化。当执行只剩一个数,该数组有序
*/
public class HeapSort {
public void heapFixup(int<span style="font-family: Arial, Helvetica, sans-serif;"> array[],int begin,int end)//自头节点开始上而下调整</span>
{
int temp=array[begin];//头结点存放备份
int parent=begin;
int lchild=2*parent+1; //左孩子
while(lchild<=end)
{
if(lchild+1<=end&&array[lchild]>array[lchild+1])//寻找左右孩子中最小的一个
lchild++;
if(temp<array[lchild])//备份节点小于孩子节点的最小的那一个时,跳出循环
break;
array[parent]=array[lchild];//子节点上升
parent=lchild;//查看下一个子节点的情况
lchild=parent*2+1;
}
array[parent]=temp; //将备份的头结点放到对应的位置上去
}
public void heapSort()
{
HeapSort a= new HeapSort();
int array[] = {9,8,7,6,5,4,3,2,1};
int temp;
for(int i =array.length/2-1;i>=0;i--)//初始化堆,
a.heapFixup(array,i,array.length-1);
for(int n=array.length-1;n>=1;n--)//排序,每次将数组第一个和最后一个对换,重新调成小顶堆
{
temp=array[n];
array[n]=array[0];
array[0]=temp;//删除小顶堆的根,然后把最后一个元素放上去。
for(int i:array)
System.out.print(i+" ");
System.out.println();
a.heapFixup(array,0,n-1);//重新调整堆
}
}
public static void main(String[] args) {
HeapSort a=new HeapSort();
a.heapSort();
}
}
<img src="https://img-blog.youkuaiyun.com/20140723204909546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTkxODI2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);" alt="" />