1. 插入排序:InsertSort
1.1 插入排序的原理:
插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌
1.2 代码
using SortInterface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SortItem
{
public class InsertSort : ISortItem
{
public override string SortTypeName
{
get
{
return "插入排序";
}
}
protected override void Sort(List<int> listNumber)
{
int i;
int j;
for (i = 1; i < listNumber.Count; i++)
{
int iTempNumber = listNumber[i];
j = i - 1;
while (j>= 0&&iTempNumber < listNumber[j])
{
listNumber[j + 1] = listNumber[j];
ChangeNumber(j + 1, listNumber[j]);
j--;
}
listNumber[j + 1] = iTempNumber;
ChangeNumber(j + 1, iTempNumber);
}
}
}
}
1.3 界面效果
1.4 时间复杂度&空间复杂度
1.4.1时间复杂度
在插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N- 1次,时间复杂度为。最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为 。平均来说,A[1…j-1]中的一半元素小于A[j],一半元素大于A[j]。插入排序在平均情况运行时间与最坏情况运行时间一样,是输入规模的二次函数 。
1.4.2空间复杂度
插入排序的空间复杂度为常数阶 。
1.4.3稳定性分析
如果待排序的序列中存在两个或两个以上具有相同关键词的数据,排序后这些数据的相对次序保持不变,即它们的位置保持不变,通俗地讲,就是两个相同的数的相对顺序不会发生改变,则该算法是稳定的;如果排序后,数据的相对次序发生了变化,则该算法是不稳定的。关键词相同的数据元素将保持原有位置不变,所以该算法是稳定的 。