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));
}
}