堆排序

在堆排序中,我们首先需要建立一个最大堆(每个最小堆的堆顶元素大于它的子节点),,建立好后在堆顶的元素一定是最大元素,此时我们将这个元素和最后一个元素进行交换,然后重新调整树,让它满足最大堆,以此类推直到交换到第二个元素停止交换。

以下是代码实现:

int n = 14;

int[] arrs = new int[n+1];

private void initArrs() {

    arrs[1] = 99;
    arrs[2] = 5;
    arrs[3] = 36;
    arrs[4] = 7;
    arrs[5] = 22;
    arrs[6] = 17;
    arrs[7] = 46;
    arrs[8] = 12;
    arrs[9] = 2;
    arrs[10] = 19;
    arrs[11] = 25;
    arrs[12] = 28;
    arrs[13] = 1;
    arrs[14] = 92;

}

private void siftdown(int i) {

    int flag = 1;

    while(i * 2 <= n && flag == 1) {
        flag = 0;
        int min = i;
        if (arrs[min] < arrs[i * 2]) {
            min = i * 2;
            flag = 1;
        }

        if (i * 2 + 1 <= n) {
            if (arrs[min] < arrs[i * 2 + 1]) {
                min = i * 2 + 1;
                flag = 1;
            }
        }

        if (flag == 1) {
            swap(i, min);
            i = min;
        }
    }
}

private void swap(int i, int min) {
    int temp = arrs[i];
    arrs[i] = arrs[min];
    arrs[min] = temp;
}

private void createHeap() {
    for (int i = n / 2 ; i >= 1; i--) {
        siftdown(i);
    }
}

private void heapSort() {
    while (n > 1) {
        swap(1, n--);
        siftdown(1);
    }
}

@Test
public void testHeapSort() {
    initArrs();
    createHeap();
    heapSort();
    for (int i = 1; i <= 14; i++) {
        System.out.println(arrs[i]);
    }
}
posted @ 2017-11-26 22:08  Arthur_08320  阅读(95)  评论(0编辑  收藏  举报