如果下标是从0开始,要特别注意:
一个根节点的子节点为i * 2 + 1,而不是i * 2
package com.wildchap.array;
import java.util.Arrays;
/**
*
* @author wang 993704315@qq.com
*
*
*/
public class SimpleSort {
/**
* 调整beg下属树的大顶堆
* wang
*/
public void heapSort(int[] a, int beg, int end) {
if(beg<end) {
/*i从第一个子节点的开始*/
int i = beg * 2;
if(i == 0) i = 1;
/*暂存该点值*/
int key = a[beg];
while(i <= end) { //只要没到末尾就继续
if((i+1) <= end && a[i] < a[i+1]) //取a[i]和a[i+1]中大的那个
i++;
if(a[i] > key) {//如果子节点值比该值大的话
a[beg] = a[i];
beg = i;
i = i * 2 + 1;
}else //它的子节点都没问题,那就不需要更改了
break;
}
a[beg] = key;
}
}
/**
* 完整堆排序代码
* wang
*/
public void heapSortFinal(int[] a) {
int len = a.length;
SimpleSort ss = new SimpleSort();
/*初始化建立大顶堆(从第一个子节点开始)*/
for(int i=(len-1)/2; i>=0; i--) {
ss.heapSort(a, i, len-1);
//System.out.println(i + " " + Arrays.toString(a));
}
for(int i=len-1; i>0; i--) {
/*每次把堆顶放到a[i]*/
int temp = a[0];
a[0] = a[i];
a[i] = temp;
System.out.println(i + " " + Arrays.toString(a));
ss.heapSort(a, 0, i-1);
}
}
public static void main(String[] args) {
int[] a = new int[] {0, 5, 8, 6, 2, 1, 9, 7};
System.out.println("Before sort:" + Arrays.toString(a));
SimpleSort ss = new SimpleSort();
ss.heapSortFinal(a);
System.out.println("After sort:" + Arrays.toString(a));
}
}