排序类:
package heap;
public class HeapSort
{
private int[] list;
public HeapSort(int[] list)
{
this.list = list;
}
/**
* 调整堆,从最后一个非叶子结点开始调整
* @param i :调整的起始位置
* @param size :调整列表的尺寸大小
*/
private void AdjustHeap(int i,int size)
{
int nleftChild = 2 * i;
int nRightChild = 2 * i + 1;
int tmp = i; //记录调整的位置,用来记录待调整的左孩子或者右孩子在数组中的索引
if( i < size / 2)
{
if(nleftChild < size && list[nleftChild] >= list[tmp])
{
tmp = nleftChild;
}
if(nleftChild < size && list[nRightChild] >= list[tmp])
{
tmp = nRightChild;
}
if(tmp != i) //此时满足交换条件,如果左孩子与最后一个非叶结点满足交换条件,则交换,同理,右孩子亦是如此
{
int Tmp = list[tmp];
list[tmp] = list[i];
list[i] = Tmp;
AdjustHeap(tmp,size); //递归调整
}
}
}
/**
* 从最后一个非叶结点处倒序调整为堆
* @param i
* @param size
*/
private void BuildHeap(int size)
{
for(int i = size / 2 ;i>= 0;i--)
{
AdjustHeap(i,size);
}
}
public void Sort()
{
BuildHeap(list.length); //先建立堆
for(int i = list.length - 1;i>0;i--)
{
int Tmp = list[0];
list[0] = list[i];
list[i] = Tmp;
AdjustHeap(0,i);
}
}
public void print()
{
for(int i=0;i<list.length;i++)
{
System.out.print(" " +list[i]);
}
}
}
package heap;
public class MainClass {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] list = {-9,8,1,2,5,4,7,6,3,9};
HeapSort hs = new HeapSort(list);
hs.Sort();
hs.print();
}
}