当我实现Merge Sort时,我发现了这段代码:
public static void merge(Comparable[] a, int lo, int mid, int hi)
{ // Merge a[lo..mid] with a[mid+1..hi].
int i = lo, j = mid+1;
for (int k = lo; k <= hi; k++) // Copy a[lo..hi] to aux[lo..hi].
aux[k] = a[k];
for (int k = lo; k <= hi; k++) // Merge back to a[lo..hi].
if (i > mid)
a[k] = aux[j++];
else if (j > hi )
a[k] = aux[i++];
else if (less(aux[j], aux[i]))
a[k] = aux[j++];
else
a[k] = aux[i++];
}
<小时/> 这个逐个合并子数组!但令我困惑的是,在参数中,为什么
Comparable[] a
在使用int[] a
仍然可以解决时使用了Comparable[]
。在这种情况下,Comparable的使用是否会添加任何性能调整?
从其他答案我发现,
如果要定义默认(自然)排序,请使用Comparable 有问题的对象的行为,通常的做法是使用a 对象的技术或自然(数据库?)标识符。
如果要定义外部可控排序,请使用Comparator 行为,这可以覆盖默认的排序行为。
问题是:git
的使用是否会提高此代码的效率?
答案 0 :(得分:0)
使用Comparable[]
并不会提高您显示的代码的效率。
您展示的代码适用于任何可比较的对象数组,而不仅仅是int
s。
所有差异都可以在less
方法执行中注意到,这在您的问题中没有显示,但我认为它类似于return a.compareTo(b) < 0;
。
如果注意到任何效率差异,则可能是由于compareTo
对象的Comparable
方法实现所致。