共同学习Java源代码-数据结构-PriorityQueue类(七)
2018-01-19 07:21
281 查看
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) { Comparable<? super E> key = (Comparable<? super 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) { Comparable<? super E> key = (Comparable<? super E>)x; inthalf = size >>> 1; while (k < half) { intchild = (k << 1) + 1; Object c = queue[child]; intright = child + 1; if (right < size && ((Comparable<? super 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进行向后移位 几乎完全一样 不多说了
这是siftUp方法 判断comparator属性是否为空如果不为空就调用siftUpUsingComparator方法 否则调用siftUpComparable方法
@SuppressWarnings("unchecked") privatevoid siftUpComparable(intk, E x) { Comparable<? super E> key = (Comparable<? super 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) { Comparable<? super E> key = (Comparable<? super E>)x; inthalf = size >>> 1; while (k < half) { intchild = (k << 1) + 1; Object c = queue[child]; intright = child + 1; if (right < size && ((Comparable<? super 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源代码-数据结构-PriorityQueue类(八)
- 共同学习Java源代码-数据结构-PriorityQueue类(六)
- 共同学习Java源代码-数据结构-PriorityQueue类(一)
- 共同学习Java源代码-数据结构-PriorityQueue类(三)
- 共同学习Java源代码-数据结构-PriorityQueue类(五)
- 共同学习Java源代码-数据结构-PriorityQueue类(四)
- 共同学习Java源代码-数据结构-PriorityQueue类(二)
- 共同学习Java源代码--数据结构--LinkedList类(六)
- 共同学习Java源代码--数据结构--AbstractList抽象类(六)
- 共同学习Java源代码--数据结构--AbstractList抽象类(二)
- 共同学习Java源代码--数据结构--ArrayList类(四)
- 共同学习Java源代码--数据结构--List接口
- 共同学习Java源代码--数据结构--LinkedList类(八)
- 共同学习Java源代码--数据结构--ArrayList类(五)
- 共同学习Java源代码--数据结构--LinkedList类(一)
- 共同学习Java源代码--数据结构--ArrayList类(一)
- 共同学习Java源代码--数据结构--AbstractList抽象类(三)
- 共同学习Java源代码--数据结构--开篇语
- 共同学习Java源代码--数据结构--AbstractCollection抽象类(一)
- 共同学习Java源代码--数据结构--AbstractList抽象类(四)