堆排序(小顶堆)

MinHeap(A){
    n=a.length;
    for i from n/2-1 down to 0{
        MinHeapFixDown(A,i)
    }
}
MinHeapFIxDown(A,i){
    //先找到左右孩子
    left=2*i+1;
    right=2*i+2;

    //左右孩子已经越界,i就是叶子节点
    if(left>n){
        return;
    }
    min=left;
    if(right>n){
        min=left;
    }else{
        if(A[right]=0;x--){
        swap(A,0,x);
    //缩小堆的范围,对堆顶进行向下调整
    MinHeapFixDown(A,0,x);
}
package 堆排序;

import java.util.Arrays;
//小顶堆做堆排序后是逆序
//大顶堆做堆排序后是正序

public class 堆排序 {
    public static void main(String[] args) {
        int[] arr={9,7,8,10,12,9,10};
        sort(arr);
        MinHeap(arr);
    }

    public static void MinHeap(int[] A) {
        int n = A.length;
        for (int i = n / 2 - 1; i >= 0; i--) {
            MinHeapFixDown(A, i,n);
        }
        System.out.println("A = " + Arrays.toString(A));
    }

    public static void MinHeapFixDown(int[] A, int i, int n) {
        //先找到左右孩子
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        //左右孩子已经越界,i就是叶子节点
        if (left > n) {
            return;
        }
        int min = left;
        if (right > n) {
            min = left;
        } else {
            if (A[right] < A[left]) {
                min = right;
                //如果A[i]比两个孩子都小,不用调整
                if (A[i] <= A[min]) {
                    return;
                }
                //否则,找到两个孩子中较小的,和i做交换
                int temp = A[i];
                A[i] = A[min];
                A[min] = temp;
                //小孩子那个位置的值发生了变化,i的值变更为小孩子那个位置的下标,递归调整
                MinHeapFixDown(A, min, n);
            }
        }
    }

    static void sort(int[] A) {
        //先对A进行堆化
        MinHeap(A);
        int n=A.length;
        //把堆顶和最后一个元素对调
        for (int x = n - 1; x >= 0; x--) {
            swap(A, 0, x);
            //缩小堆的范围,对堆顶进行向下调整
            MinHeapFixDown(A, 0, x);
        }
        System.out.println("A = " + Arrays.toString(A));

    }

    private static void swap(int[] A, int i, int x) {
        int temp=A[i];
        A[i]=A[x];
        A[x]=temp;
    }
}

你可能感兴趣的:(算法很美,算法,排序算法,数据结构)