合并两个排序数组的算法

时间:2018-01-14 14:59:16

标签: arrays algorithm

只是想知道以下解决方案是否良好。 我检查过它似乎是正确的,虽然表面上与传统的“两指针”解决方案完全不同。

这个想法是迭代两个数组同时运行maxSize迭代,其中maxSize是较大数组的大小。

在每次迭代中,只要“i< a.Length&& i< b.Length”,我比较两个数字,它们各自数组中的索引是相同的,每次都保持较大的数字在变量prevMax。 然后我将这个prevMax与新的currMax和currMin进行比较,并采取相应的行动。

现在,如果迭代次数超过较小数组的大小,则此次比较仅在较大数组中的当前数字与之前发现较大的数字之间进行,即currMax(我知道有问题的变量名称) ,我有另一个更具可读性的版本,我可能会在以后发布)绝对不是最优雅的解决方案,但我想关注的是否有效

以下是代码:

// example input

int[] b = {-3, -1, 3, 4, 8};
int[] a = {-5, 2, 5, 10, 18};

// defining variables
int prevMax = default, currMax = default, currMin = default;
int maxSize = Math.Max(a.Length, b.Length);

List<int> result = new List<int>();

// start of algorithm

for(int i = 0; i < maxSize; i++)
{
    if(i < a.Length && i < b.Length)
    {
        currMax = Math.Max(a[i], b[i]);
        currMin = Math.Min(a[i], b[i]);
    }
    else if(a.Length < b.Length)
    {
        currMin = Math.Min(currMax, b[i]);
        currMax = Math.Max(currMax, b[i]);  
        prevMax = currMax;
    }   
    else if(a.Length > b.Length)
    {
        currMin = Math.Min(currMax, a[i]);
        currMax = Math.Max(currMax, a[i]);      
        prevMax = currMax;
    }

    if(prevMax != currMax && prevMax < currMin)
    {
        result.Add(prevMax);
        result.Add(currMin);        
    }
    else if(prevMax != currMax && prevMax < currMax)
    {   
        result.Add(currMin);
        result.Add(prevMax);
    }
    else result.Add(currMin);

    prevMax = currMax;
}

result.Add(currMax);

// end of algorithm

0 个答案:

没有答案