参考算法 - 第四版 Robert和Kevin ,我很难理解插入排序的最佳案例复杂性,如下面的代码所示:
public class Insertion
{
public static void sort(Comparable[] a)
{ // Sort a[] into increasing order.
int N = a.length;
for (int i = 1; i < N; i++)
{ // Insert a[i] among a[i-1], a[i-2], a[i-3]... ..
for (int j = i; j > 0 && less(a[j], a[j-1]); j--)
exch(a, j, j-1);
}
}
// See page 245 for less(), exch(), isSorted(), and main().
}
在书中说,在最好的情况下(排序数组),交换次数为0,比较次数为N-1。虽然我知道交换是0,但我很难 在最佳情况下,如何比较N-1?
答案 0 :(得分:2)
如果数组已经排序,那么在您提供的insert-sort的特定实现中,每个元素只会与其 immediate 前身进行比较。由于它不小于那个前任,因此内部for
- 循环立即中止,无需进一步比较或交换。
请注意,insert-sort的其他实现不一定具有该属性。
答案 1 :(得分:0)
在最佳情况下,如何比较N-1?
当你有一个已排序的数组时,最好的情况就会发生。比较的数量是n-1
,因为比较是从第二个元素开始直到最后一个元素。
这也可以从您给定的代码中观察到:
for (int i = 1; i < N; i++) //int i=1 (start comparing from 2nd element)
答案 2 :(得分:-1)
具体实施的源代码是:
public class Insertion
{
public static void sort(Comparable[] a)
{ // Sort a[] into increasing order.
int N = a.length;
bool exc = false;
for (int i = 1; i < N; i++)
{ // Insert a[i] among a[i-1], a[i-2], a[i-3]... ..
for (int j = i; j > 0 && less(a[j], a[j-1]); j--) {
exch(a, j, j-1);
exc = true;
}
if (!exc)
break;
}
}
// See page 245 for less(), exch(), isSorted(), and main().
}