选择排序-堆排序

堆排序的JAVA实现

import java.util.Arrays;

//堆排序之JAVA代码实现
public class HeapSort {
    /**
     * s
     * 
     * @param array
     *            要排序的数组。
     * @param parent
     *            每次生成堆选取的选取的第一个非终端节点。
     * @param length
     *            参与到生成的堆过程中的元素个数。
     */

    public void HeapAdjust(int[] array, int parent, int length) {
        int temp = array[parent]; // temp保存当前父节点

        int child = 2 * parent + 1; // 先获得左孩子
        while (child < length) {
            // 如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点
            if (child + 1 < length && array[child] < array[child + 1]) {
                child++;
            }
            // 如果父结点的值已经大于孩子结点的值,则直接结束
            if (temp >= array[child])
                break;
            // 把孩子结点的值赋给父结点
            array[parent] = array[child];
            // 选取孩子结点的左孩子结点,继续向下筛选
            parent = child;
            child = 2 * parent + 1;
        }
        array[parent] = temp;// 把最初的值(父节点)放到最后的子节点的位置
    }

    public void heapSort(int[] list) {
        // 循环建立初始堆
        for (int i = list.length / 2 - 1; i >= 0; i--) {
            HeapAdjust(list, i, list.length);
        }
        // 进行n-1次循环,完成排序
        for (int i = list.length - 1; i > 0; i--) {
            // 最后一个元素和第一元素进行交换,相当于把最大的元素沉淀到最后的位置上;把最后位置上的数字放入前面等待下次堆排序
            int temp = list[i];
            list[i] = list[0];
            list[0] = temp;

            // 筛选 R[0] 结点,得到i个结点的堆
            HeapAdjust(list, 0, i);// 随着循环的进行,每次参与堆排序的序列会逐次减少,知道最后只剩
            System.out.format("第 %d 趟: \t", list.length - i);
            printPart(list, 0, list.length - 1);
        }
    }

    // 打印序列
    public void printPart(int[] list, int begin, int end) {
        for (int i = 0; i < begin; i++) {
            System.out.print("\t");
        }
        for (int i = begin; i <= end; i++) {
            System.out.print(list[i] + "\t");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        HeapSort hs = new HeapSort();
        int array[] = new int[] { 2, 1 };
        hs.heapSort(array);
        System.out.println(Arrays.toString(array));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值