插入排序
排序原理:
1、把所有元素分为两组,已经排序的和未排序的
2、找到未排序的组中的第一个元素,向已经排序的组中进行插入
3、倒叙遍历已经排序的元素,依次和待插入的元素进行比较,查找到一个元素小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位。
源码
/// <summary>
/// 插入排序
/// </summary>
public class InsertSort
{
public static List<int[]> result = new List<int[]>();
public static void sort(int[] a)
{
result.Clear();
result.Add((int[])a.Clone());
for (int i = 1; i < a.Length; i++)
{
for (int j = i; j > 0; j--)
{
if (compareTo(a[j-1], a[j]))
{
exec(a,j-1,j);
result.Add((int[])a.Clone());
}
else
break;
}
}
}
/// <summary>
/// 交换两个位置的元素
/// </summary>
/// <param name="a"></param>
/// <param name="i"></param>
/// <param name="j"></param>
private static void exec(int[] a, int i, int j)
{
int temp = a[j];
a[j] = a[i];
a[i] = temp;
}
/// <summary>
/// 判断两个元素大小
/// </summary>
/// <param name="i"></param>
/// <param name="j"></param>
/// <returns></returns>
private static bool compareTo(int i, int j)
{
return i > j;
}
}
演示
时间复杂度
比较的次数为(N-1)+(N-2)+…+2+1=N^2/2-N/2
交换的次数为(N-1)+(N-2)+…+2+1=N^2/2-N/2
总执行次数为N^2-N
即O(N^2)