java堆排序算法及代码

堆排序总结及代码
这里写图片描述
这里写图片描述
这里写图片描述

public class DuiPaixu {

    static  final int SIZE = 10;

    static void heapSort(int a[],int n){   //堆排序 
        int i,j,h,k;
        int t;

        for(i = n/2-1;i>=0;i++){//将啊a[0,n-1]  建成大根堆
            while(2*i+1<n){ //第i个节点  右子树
                j=2*i+1;
                if((j+1)<n){
                    if(a[j]<a[j+1])  //右左子树小于右子树,则需要比较右子树
                        j++;   //序号增加1,指向右子树
                }
                if(a[i]<a[j]){   //比较i与j为序号的数据
                    t = a[i];    //交换数据
                    a[i] = a[j];
                    a[j] = t;
                    i = j;   //堆被破坏,需要重新调整
                }
                else{        //比较左右子节点结构均大则堆未破坏,不再需要调整
                    break;
                }
            }
        }

        //输出构成的堆
        System.out.println("元数据构成的堆");

        for(h =0;h<n;h++){
            System.out.println("" + a[h]);
        }

        System.out.println("\n");

        for(i = n -1;i>-0;i--){
            t = a[0];   //与第i个记录交换
            a[0] = a[i];
            a[i] = t;
            k = 0;
            while(2*k+1<i){ //第i个节点有右子树
                j = 2*k +1;
                if((j+1)<i)
                {
                    if(a[j]<a[j+1])  //右左子树小于右子树,则需要比较右子树
                    {
                        j++;   //序号加一,指向右子树
                    }
                }


                if(a[k] <a[j]){  //比较i与j为序号的数据
                    t = a[k];  //交换数据
                    a[k] =a[j];
                    a[j] = t;
                    k = j;    //堆被破坏需要被重新调整
                }
                else{   // 比较左右子节点均大则堆未破坏,不再需要调整
                    break;
                }
            }
        }
        System.out.println("第"+(n - i)+"步排序结果");
        for(h = 0;h<n;h++){
            System.out.println("  "+a[h]);   //输出
        }
        System.out.println("\n");
    }


    public static void main(String[] args) {
        int[] shuzu = new int[SIZE];
        int i;

        for(i = 0;i<SIZE;i++){
            shuzu[i] =(int) (100+Math.random()*(100+1));
        }

        System.out.println("排序前的数组为:\n");
        for(i = 0;i<SIZE;i++){
            System.out.println(shuzu[i]+" ");
        }
    }

}

猜你喜欢

转载自blog.csdn.net/qq_30443907/article/details/82460159
今日推荐