堆排序

来源:互联网 发布:nginx加lua模块 编辑:程序博客网 时间:2024/06/04 19:59
package Sort;public class Heap_Sort {    static int heap_length ;    public static void main(String[] args) {        int []a = {16,14,10,8,7,9,3,2,4,1};        int []b = new int [a.length+1];         for(int i =0;i<a.length;i++){            b[i+1] = a[i];        }        a = b;//      heap_length = a.length-1;        ShowArray(a);        HEAPSORT(a);        ShowArray(a);    }    //显示数组    public static void ShowArray(int[]A){        for(int i=1;i<A.length;i++){            System.out.print(A[i]+" ");        }        System.out.println();    }    public static int PARENT(int i){//返回父节点        return i/2;    }    public static int LEFT(int i){//返回左节点        return i*2;    }    public static int RIGHT(int i){//返回右节点        return  i*2+1;    }    public static void MAX_HEAPIFY(int []A, int i){//堆的维护        int l = LEFT(i);        int r = RIGHT(i);        int largest;        //比较父节点,左右子节点大小        if(l<= heap_length && A[l]>A[i]){            largest = l;        }else{            largest = i;        }        if(r<=heap_length && A[r]>A[largest]){            largest = r;        }        //如果子节点比父节点大,则交换        if(largest != i){            int temp = A[i];            A[i] = A[largest];            A[largest] = temp;            MAX_HEAPIFY(A, largest);        }    }    /**     * 建堆     * @param A     */    public static void BUILD_MAX_HEAP(int []A){        heap_length = A.length-1;        for(int i = heap_length/2;i>=1;i--){//维护最小父节点            MAX_HEAPIFY(A, i);        }    }    public static void HEAPSORT(int []A){        BUILD_MAX_HEAP(A);//建堆        for(int i = heap_length;i>1;i--){            int temp = A[1];            A[1] = A[i];            A[i] = temp;            heap_length--;            MAX_HEAPIFY(A, 1);        }    }}
0 0
原创粉丝点击