插入排序最好的情况

时间:2017-10-09 02:04:21

标签: algorithm insertion-sort

参考算法 - 第四版 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?

3 个答案:

答案 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().
}