相关疑难解决方法(0)

用于合并排序的IEnumerable <T>的最有效算法

我有几个巨大的已排序的可枚举序列,我想合并.这些列表被操作为IEnumerable已经排序.由于输入列表已排序,因此应该可以在一次行程中合并它们,而无需重新排序任何内容.

我想保留deferred执行行为.

我试着编写一个天真的算法来做到这一点(见下文).但是,它看起来很丑陋,我确信它可以进行优化.它可能存在更多的学术算法......

IEnumerable<T> MergeOrderedLists<T, TOrder>(IEnumerable<IEnumerable<T>> orderedlists, 
                                            Func<T, TOrder> orderBy)
{
    var enumerators = orderedlists.ToDictionary(l => l.GetEnumerator(), l => default(T));
    IEnumerator<T> tag = null;

    var firstRun = true;
    while (true)
    {
        var toRemove = new List<IEnumerator<T>>();
        var toAdd = new List<KeyValuePair<IEnumerator<T>, T>>();
        foreach (var pair in enumerators.Where(pair => firstRun || tag == pair.Key))
        {
            if (pair.Key.MoveNext())
                toAdd.Add(pair);
            else
                toRemove.Add(pair.Key);
        }

        foreach (var enumerator in toRemove)
            enumerators.Remove(enumerator);

        foreach (var pair in toAdd)
            enumerators[pair.Key] = pair.Key.Current; …
Run Code Online (Sandbox Code Playgroud)

c# linq algorithm optimization performance

35
推荐指数
5
解决办法
6590
查看次数

将两个列表合并为一个并对项目进行排序

有没有办法合并(没有欺骗的联合)两个给定的列表,并使用ONE for循环以排序的方式存储项目?

另外,我正在寻找一种不使用API​​方法的解决方案(例如,union,sort等).

示例代码.

private static void MergeAndOrder() 
{
var listOne = new List<int> {3, 4, 1, 2, 7, 6, 9, 11}; 
var listTwo = new List<int> {1, 7, 8, 3, 5, 10, 15, 12}; 

//Without Using C# helper methods...
//ToDo.............................

//Using C# APi.
var expectedResult = listOne.Union(listTwo).ToList(); 
expectedResult.Sort();//Output: 1,2,3,4,5,6,7,8,9,10,11,12,15
//I need the same result without using API methods, and that too by iterating over items only once.


}
Run Code Online (Sandbox Code Playgroud)

PS:我在接受采访时被问过这个问题,但还没有找到答案.

c# sorting

4
推荐指数
2
解决办法
1万
查看次数

如何在C#中优化合并排序数组的函数

我编写这个函数来合并两个数组.

private static int[] Merge(int[] array1, int[] array2)
{
    var mergedArray = new int[array1.Length + array2.Length];
    int i = 0, j = 0, k = 0;
    while(k < mergedArray.Length)
    {
        if(i == array1.Length || j == array2.Length)
        {
             if (i <= j)
                {
                    mergedArray[k] = array1[i];
                    i++;
                }
                else
                {
                    mergedArray[k] = array2[j];
                    j++;
                }
        }
        else
        {
            if(array1[i] < array2[j])
            {
                mergedArray[k] = array1[i];
                i++;
            }
            else
            {
                mergedArray[k] = array2[j];
                j++;
            }
        }
        k++;
    }
    return mergedArray;
} …
Run Code Online (Sandbox Code Playgroud)

c# arrays sorting mergesort

4
推荐指数
2
解决办法
6790
查看次数

标签 统计

c# ×3

sorting ×2

algorithm ×1

arrays ×1

linq ×1

mergesort ×1

optimization ×1

performance ×1