countRunAndMakeAscending方法的简介
首先我们要明白一个概念:run。
RUN
run:一个最长的按升序排列的序列;或者一个最长的按严格的降序排列的序列。
run形式:
0) a[lo] <= a[lo + 1] <= a[lo + 2] <= …(升序形式)
1) a[lo] > a[lo + 1] > a[lo + 2] > … (严格的降序形式)
Code Segment
@SuppressWarnings({"uncheck", "rawtypes"})
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);
} esle { //Ascending
while(runHi < hi && ((Comparable) a[runHi]).compareTo(a[runHi -1]) >= 0)
runHi++;
}
return runHi - lo;
}
Notes:
0) 元素是可以相互比较的,即是实现接口Comparable;
1) 该方法是返回一个run的长度;
2) 注意在判断升序还是降序的if中runHi;
3) reverseRange方法是从两端收敛于(数组的)中间。下一节将介绍“mini-TimSort”,即是countRunAndMakeAscending和binarySort的综合使用。