堆排序

188 阅读1分钟

堆排序

public void sort(int[] a) {
    buildMaxHeap(a);
    int size = a.length;
    for (int i = a.length - 1; i >= 1; i--) {
        int temp = a[0];
        a[0] = a[i];
        a[i] = temp;
        size --;
        maxHeapify(a, i);
    }
}

数组存储二叉树下的父结点

public int parent(int n) {
    return n >> 1;
}

数组存储二叉树下的左孩子

public int left(int n) {
    return 2 * n + 1;
}

数组存储二叉树下的右孩子

public int right(int n) {
    return 2 * n + 2;
}

递归实现大顶堆化

public void maxHeapify(int[] a, int n) {
    int l = left(n);
    int r = right(n);
    int largest;
    if (l <= a.length && a[l] > a[n]){
        largest = l;
    } else {
        largest = n;
    }
    if (r <= a.length && a[r] > a[largest]){
        largest = r;
    }
    if (largest != n) {
        int temp = a[n];
        a[n] = a[largest];
        a[largest] = temp;
        maxHeapify(a, largest);
    }
}

构建大顶堆

public void buildMaxHeap(int[] a) {
    for (int i = a.length >> 1; i >= 0; i--) {
        maxHeapify(a, i);
    }
}

递归实现小顶堆化

public void minHeapify(int[] a, int n) {
    int l = left(n);
    int r = right(n);
    int mini;
    if (l <= a.length && a[l] < a[n]){
        mini = l;
    } else {
        mini = n;
    }
    if (r <= a.length && a[r] < a[mini]){
        mini = r;
    }
    if (mini != n) {
        int temp = a[n];
        a[n] = a[mini];
        a[mini] = temp;
        minHeapify(a, mini);
    }
}

构建小顶堆

public void buildMinHeap(int[] a) {
    for (int i = a.length >> 1; i >= 0; i--) {
        minHeapify(a, i);
    }
}