- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
来自:
http://svn.python.org/projects/python/trunk/Objects/listsort.txt
和:
http://en.wikipedia.org/wiki/Timsort
我明白了,当 a0 > a1 > a2 > ...
时,Timsort 有一些优化。 ,但是下一个数组呢:
10000,10000,9999,9999,9998,9998,....,9,9,8,8,7,7,6,6,5,5,4,4,3,3,2,2,1,1,0,0
这种阵列的时间效率是多少?
(整数用于简化示例,需要稳定排序)
我已经进行了一些测量,似乎这样的数组对于 Timsort 来说并不是“好”的情况。
实际上,JDK 中的 TimSort http://cr.openjdk.java.net/~martin/webrevs/openjdk7/timsort/raw_files/new/src/share/classes/java/util/TimSort.java
有一个方法“countRunAndMakeAscending”
@SuppressWarnings("unchecked")
private static int countRunAndMakeAscending(Object[] a, int lo, int hi) {
assert lo < hi;
int runHi = lo + 1;
if (runHi == hi)
return 1;
// Find end of run, and reverse range if descending
if (((Comparable) a[runHi++]).compareTo(a[lo]) < 0) { // Descending
while(runHi < hi && ((Comparable) a[runHi]).compareTo(a[runHi - 1]) < 0)
runHi++;
reverseRange(a, lo, runHi);
} else { // Ascending
while (runHi < hi && ((Comparable) a[runHi]).compareTo(a[runHi - 1]) >= 0)
runHi++;
}
return runHi - lo;
}
private static int countRunAndMakeAscending(Object[] a, int lo, int hi) {
int runHi = lo;
int lastEqual = lo;
int ascending = 0;
while (++runHi < hi) {
int c = ((Comparable) a[runHi+1]).compareTo(a[runHi]);
if (ascending == 0) {
if (c != 0) {
if (c > 0) {
ascending = 1;
} else {
ascending = -1;
reverseRange(a, lastEqual, runHi);
lastEqual = runHi;
}
}
} else if (ascending == 1) {
if (c < 0) {
return runHi - lo;
}
} else {
if (c > 0) {
reverseRange(a, lastEqual, runHi);
reverseRange(a, lo, runHi);
return runHi - lo;
} else if (c < 0) {
reverseRange(a, lastEqual, runHi);
lastEqual = runHi;
}
}
}
if (ascending == -1) {
reverseRange(a, lastEqual, runHi);
reverseRange(a, lo, runHi);
}
return runHi - lo;
}
最佳答案
是的。
基本上它决定“升序”真的意味着“不降序”,不失一般性——如果你有例如 [5,5,4 3] 它只会把它分解成 [5,5](升序)然后[4,3](降序)在下一次调用。
至于为什么,我想是为了简单起见:只需尝试计算 reverseRange()
的调用次数即可。在你的代码和原版中,你会明白这个想法(我注意到我花了多长时间来理解一个版本与另一个版本相比:)
编辑:错错错!正如 Oscar Smith 所指出的,原因是为了让 timsort 成为一种稳定的排序算法。
如果有人知道如何转移不应有的赏金......
关于sorting - Timsort 如何按降序处理数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20311706/
序 大家好呀,我是summo,这次来写写我在上班空闲(摸鱼)的时候做的一个小网站的事。去年阿里云不是推出了个活动嘛,2核2G的云服务器一年只要99块钱,懂行的人应该知道这个价格在业界已经是非常良心了
我尝试根据给定的级别顺序(BFS 顺序)构造 BST。我知道这是可能的,但我不知道我该怎么写。问题是我必须使用 BFS 序列。所以,我不能在这里使用递归,我必须迭代地编写我的程序......我发现这有
我是一名优秀的程序员,十分优秀!