/**
 * 一次建堆的过程
 * @param a
 */
public static void createHeap(int[] a,int i,int n){
int temp;
int j=2*i;
int x=a[i];
while(j<=n){
if(a[j]<a[j+1]){
j++;
}
if(a[i]<a[j]){
a[i]=a[j];
i=j;
j=2*i;
}else{
break;
}
}
a[i]=x;
}

/**
 * 堆排序
 * @param a
 */
public static void heapSort(int[] a,int n){
int temp=0;
for(int i=n/2-1;i>=0;i--){
createHeap(a,i,n);
}
for(int m=n;m>=1;m--){
temp=a[m-1];
a[m-1]=a[0];
a[0]=temp;
createHeap(a,0,m-1);
}
}        public static void main(String[] args){
                int[] a=new int[]{43,2,5,64,23,1};
heapSort(a,a.length);
System.out.println("--堆排序----");
for(int m : a){
System.out.println(m);
}
}输出结果如下:
--堆排序----
2
1
23
43
5
64为什么打印出的是这们?请高手帮忙高度一下?

解决方案 »

  1.   

    看你这个代码也很费力。。好好的贴代码。连个备注也没有。
    我这里有个例子。没时间帮你调试。
    你看看。private void adjust(int r[], int k, int m)
    {
        int i=k, j=2*i; //将筛选记录暂存
        int temp;
        while (j<=m )           //筛选还没有进行到叶子
        {
            if (j<m && r[j]<r[j+1]) j++;  //左右孩子中取较大者
            if (r[i]>r[j]) break; 
            else 
            {
            temp = r[i];
            r[i] = r[j];
            r[j] = temp; //将筛选记录移到正确位置
                i=j;  
                j=2*i;
            }
         }
    } public void heapSort(int r[ ], int n)
    {
        int i;
        int temp;
    for (i=n/2; i>=1; i--)      //初建堆
    {
    adjust(r, i, n);     
    } for (i=n; i>=2; i-- )
        {
            temp = r[1];
            r[1] = r[i];
            r[i] = temp; //移走堆顶
            adjust(r, 1, i-1);        //重建堆
         }
    }测试代码public static void main(String[] args) 
    {
    int a[]={-1,37,52,98,75,35,21,10,24,9,78,54}; //不用a[0],所以a[0]是-1
    int n = a.length - 1;

    Sort sort = new Sort();
                    sort.heapSort(a, n);
                    for(int i = 1;i <= n; i++)
    System.out.print(a[i] + " ");