【算法】 插入排序
/// <summary>
/// 插入排序
/// 思路:
/// 遍历源集合元素插入到新集合中,
/// 插入时从后往前遍历新集合,
/// 比较插入元素与新集合元素大小,以此判断插入的位置
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list">源集合</param>
/// <param name="comparer">泛型判断函数</param>
/// <returns></returns>
public static void Sort<T>(List<T> list, Func<T, T, bool> comparer)
{
if (list == null || list.Count <= 1)
{
return;
}
for (int i = 1; i < list.Count; i++) // 遍历源集合,从索引1开始(0 已经在子集合里)
{
T temp = list[i]; // 缓存遍历元素
int j = i - 1;
for (; j >= 0; j--) // 从后遍历子集合
{
if (comparer(list[j], temp)) // 如果子集元素大于缓存元素,则往后移一位,最后在留出来的空位插入缓存元素
{
list[j + 1] = list[j];
}
else // 否则跳出本次循环
{
break;
}
}
if (j != i - 1) // 判断是否需要移动位置
{
list[j + 1] = temp; // 将缓存元素插入到子集合
}
}
}