堆排序

2021-01-10  本文已影响0人  陈亚文
public class HeapSort{

    public static void main(String[] args) {

        int arr[] = {1,4,2,3,6,7,8,9,10,4};
        for(int i=arr.length;i>0;i--){

            for(int j=i/2-1;j>=0;j--){ //从最大的非叶子节点开始
                adjustHeap(arr,j,i);
                swap(arr,0,i-1);
            }
        }

        //打印排序后的数组
        StringBuffer sb = new StringBuffer();
        for(int m=0;m<arr.length;m++){
            sb.append(arr[m]).append(",");
        }
        System.out.println(sb.toString());

    }

    //参数:i 数组的下标(0开始计数),len为当前参与排序的数组真实长度(1开始计数)
    public static void adjustHeap(int arr[], int i,int len){
        int temp = arr[i];
        for(int k=2*i+1;k<len;k=2*k+1){ //k=2*k+1,保证在当前节点未移动时,继续向下遍历
            //其中k=2*i+1为i节点的左子树,k=2*i+1为i节点的右子树
            if(k+1<len && arr[k]<arr[k+1]){
               k=k+1;

            }
            if(arr[k]>arr[i]){
                arr[i] = arr[k];
                i = k; //这个存值,是为了识别替换的位置,执行arr[i] = temp;
            }

        }
        arr[i] = temp;
    }

    public static void swap(int arr[],int start,int end){
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
    }
}

上一篇下一篇

猜你喜欢

热点阅读