标签:
【算法】 插入排序
/// <summary>
/// 插入排序
/// 思路: 遍历源集合元素插入到新集合中,
/// 插入时从后往前遍历新集合,
/// 比较插入元素与新集合元素大小,以此判断插入的位置
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list">源集合</param>
/// <param name="func">泛型判断函数</param>
/// <returns></returns>
public static List<T> Sort<T>(List<T> list, Func<T, T, bool> func)
{
if (list == null || list.Count <= 1)
{
return list;
}
var result = new List<T>(list.Count) { list[0] };// 排序后的子集合(存入第一个源集合元素)
for (int i = 1; i < list.Count; i++) // 遍历源集合,从索引1开始(0 已经在子集合里)
{
for (int j = i - 1; j >= 0; j--) // 从后遍历子集合
{
if (func(result[j], list[i])) // 如果子集元素大
{
if (j == i - 1)
{
result.Add(result[j]); // 扩展子集集合
}
result[j + 1] = result[j]; // 调整子集元素位置,使大的元素往后移一位
result[j] = list[i];
continue;
}
if (j == i - 1) // 如果子集最后(即最大)元素小于源集合元素,则在末尾添加
{
result.Add(list[i]);
}
break;
}
}
return result;
}
标签:
原文地址:http://www.cnblogs.com/fzz2727551894/p/4180569.html