while在算法中的用法收集

这段代码展示了在算法第四版中用于堆排序的`swim`和`sink`方法。`swim`方法处理节点上浮,当节点值大于其父节点时,将节点与其父节点交换。`sink`方法处理节点下沉,检查节点是否小于其子节点,如果小于则交换,确保堆的性质。这两个方法是优先队列(堆)操作的关键部分。
摘要由CSDN通过智能技术生成

出处:算法第四版

表达一个用的角度,此处代码实际用在heapSort的时候会发现index边界问题没有考虑

public class Helper {
    public static boolean isLess(int[] a, int i, int j) {
        return a[i] < a[j];
    }

    public static void exch(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

    /**
     * 算法第四版中实现优先队列时,由于某个节点变得比它父节点大而打破平衡
     * 的该节点上浮方法
     * @param a 简化的int数组
     * @param k 要上浮的元素的index
     */
    public static void swim(int[] a, int k) {
        while (k > 1 && isLess(a, k / 2, k)) {
            // k > 1保证k / 2有意义, k / 2是当前k的父节点
            // 父节点的值小于当前节点就上浮
            exch(a, k / 2, k);
            // 子节点变为父节点继续上移
            k /= 2;
        }
    }

    /**
     * 算法第四版中实现优先队列时,由于某个节点变得比它子节点小而打破平衡
     * 的该节点下沉方法
     * @param a 简化的int数组
     * @param k 要下沉的元素的index
     */
    public static void sink(int[] a, int k) {
        while (2 * k <= a.length) {
            // 获得子节点index
            int j = 2 * k;
            if (j < a.length && isLess(a, j, j+1)) {
                // 找到当前子节点中值更大的index
                j++;
            }
            if (!isLess(a, k, j)) {
                // 如果k比子节点大,不交换
                break;
            }
            exch(a, k, j);
            // 顶端index变为子节点的index,继续向下判断时候还有更小的子节点
            k = j;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值