共同学习Java源代码-数据结构-PriorityQueue类(七)

    privatevoid siftUp(intk, E x) {

        if (comparator != null)

            siftUpUsingComparator(k, x);

        else

            siftUpComparable(k, x);

}

这是siftUp方法 判断comparator属性是否为空如果不为空就调用siftUpUsingComparator方法 否则调用siftUpComparable方法

 

    @SuppressWarnings("unchecked")

    privatevoid siftUpComparable(intk, E x) {

        Comparablesuper E> key = (Comparablesuper E>) x;

        while (k > 0) {

            intparent = (k - 1) >>> 1;

            Object e = queue[parent];

            if (key.compareTo((E) e) >= 0)

                break;

            queue[k] = e;

            k = parent;

        }

        queue[k] = key;

}

这个是用Comparable方式将元素前移的方法

第一个参数是要前移的下标k 第二个参数是要前移的元素x

将最后一个x转为Comparable接口实现类key

判断如果k大于0 就进入while循环 将k减一后无符号右移一位 就是除以2 得到临时变量parent 获取数组parent处的元素e 判断如果key大于等于e 也就是参数元素大于等于parent元素 直接跳出循环 如果key小于e 那么将k处也就是参数下标处的元素设为e将k赋为parent 继续进入循环判断

跳出循环后将k处赋为key

这个就类似选择排序 将参数不断与下标的中间值进行比较 如果大于就跳出循环将参数直接放在下标处 如果不大于就将下标不断减半再比较参数和减半后的下标的中间值 就是一步步缩小比较的范围 然后将参数放在合适的位置

 

    @SuppressWarnings("unchecked")

    privatevoid siftUpUsingComparator(intk, E x) {

        while (k > 0) {

            intparent = (k - 1) >>> 1;

            Object e = queue[parent];

            if (comparator.compare(x, (E) e) >= 0)

                break;

            queue[k] = e;

            k = parent;

        }

        queue[k] = x;

}

这个和上面那个非常类似 就是用comparator进行比较

 

    privatevoid siftDown(intk, E x) {

        if (comparator != null)

            siftDownUsingComparator(k, x);

        else

            siftDownComparable(k, x);

}

siftDown方法 根据comparator属性是否为空调用不同的siftDown方法 和上面的siftUp类似

 

    @SuppressWarnings("unchecked")

    privatevoid siftDownComparable(intk, E x) {

        Comparablesuper E> key = (Comparablesuper E>)x;

        inthalf = size >>> 1;               while (k < half) {

            intchild = (k << 1) + 1;            Object c = queue[child];

            intright = child + 1;

            if (right < size &&

                ((Comparablesuper E>) c).compareTo((E) queue[right]) > 0)

                c = queue[child = right];

            if (key.compareTo((E) c) <= 0)

                break;

            queue[k] = c;

            k = child;

        }

        queue[k] = key;

    }

这个是根据comparable方式将元素后移的方法

第一个参数是要移动到的下标 第二个参数是要后移的元素

先将第二个参数x强转为Comparable

计算出数组非空元素长度的一半half

进入while循环 循环条件为下标小于half

将下标乘以二加一 赋给临时变量child

将数组child下标处元素赋给临时变量c

将child变量加一赋给临时变量right

判断如果right小于size 也就是说没有超过非空元素数目且 child处元素c大于right处元素将right赋给child c赋为right处元素 也就是c赋为原来child右边那个元素 child值加一

判断如果参数元素小于c 跳出while循环

将参数下标处元素赋为c 将k赋为child

跳出循环后将下标为k的元素赋为参数元素

这个也类似选择排序 只是范围越来越大 将参数元素与下标的二倍和二倍加一不断比较

 

    @SuppressWarnings("unchecked")

    privatevoid siftDownUsingComparator(intk, E x) {

        inthalf = size >>> 1;

        while (k < half) {

            intchild = (k << 1) + 1;

            Object c = queue[child];

            intright = child + 1;

            if (right < size &&

                comparator.compare((E) c, (E) queue[right]) > 0)

                c = queue[child = right];

            if (comparator.compare(x, (E) c) <= 0)

                break;

            queue[k] = c;

            k = child;

        }

        queue[k] = x;

    }

 

这是用Comparator进行向后移位 几乎完全一样 不多说了

你可能感兴趣的:(Java)