2.1.25

2.1.25 #

解答 #

使用依次赋值的方式腾出空间,到达指定位置之后再把元素插入。

看代码会方便理解一点。

官方实现:InsertionX.java

代码 #

public class InsertionSort : BaseSort
{
    /// <summary>
    /// 利用插入排序将数组按升序排序。
    /// </summary>
    /// <param name="a">需要排序的数组。</param>
    public override void Sort<T>(T[] a)
    {
        var n = a.Length;
        var exchanges = 0;

        for (var i = n - 1; i > 0 ; i--)
        {
            if (Less(a[i], a[i - 1]))
            {
                Exch(a, i, i - 1);
                exchanges++;
            }
        }
        if (exchanges == 0)
            return;

        for (var i = 2; i < n; i++)
        {
            var j = i;
            var v = a[i];
            while (Less(v, a[j - 1]))
            {
                a[j] = a[j - 1];
                j--;
            }
            a[j] = v;
            Debug.Assert(IsSorted(a, 0, i));
        }
        Debug.Assert(IsSorted(a));
    }

    /// <summary>
    /// 利用插入排序将数组排序。(使用指定比较器)
    /// </summary>
    /// <typeparam name="T">数组元素类型。</typeparam>
    /// <param name="a">需要排序的数组。</param>
    /// <param name="c">比较器。</param>
    public void Sort<T>(T[] a, IComparer<T> c)
    {
        var n = a.Length;
        var exchanges = 0;

        for (var i = n - 1; i > 0; i--)
        {
            if (Less(a[i], a[i - 1], c))
            {
                Exch(a, i, i - 1);
                exchanges++;
            }
        }
        if (exchanges == 0)
            return;

        for (var i = 2; i < n; i++)
        {
            var j = i;
            var v = a[i];
            while (Less(v, a[j - 1], c))
            {
                a[j] = a[j - 1];
                j--;
            }
            a[j] = v;
            Debug.Assert(IsSorted(a, 0, i, c));
        }
        Debug.Assert(IsSorted(a, c));
    }
}

另请参阅 #

Sort 库