对数组进行排序 - 并合并 - 算法

时间:2012-03-19 18:13:36

标签: php algorithm sorting

我有两个字符串数组:一个有序数组 - 数组X和一个无序数组 - 数组Y

新数组应具有的内容:所有项目应仅来自数组Y,并且应根据X中的顺序对X和Y之间重叠的项目进行排序,然后其余项目(如果有的话)应该位于结尾的顺序与原来在Y中的顺序相同.X可能包含不在Y中的条目,我们只想忽略它们。

这样做的有效方法是什么(在php中)?

示例:

数组X:{'a','z','q','d'}

数组Y:{'b','c','a','d','z'}

结果:{'a','z','d','b','c'}

所以我的想法是:我们想要获取第二个数组(数组Y),并根据数组X中给出的顺序对其中的元素进行排序。由于数组Y可能有更多的额外元素,我们只想将这些额外的元素放在这个新结果数组的末尾。有意义吗?

3 个答案:

答案 0 :(得分:3)

$r = array_merge(array_intersect($x, $y), array_diff($y, $x))

答案 1 :(得分:1)

你可以这样做:

$result = array();

// build index array for constant lookup
$indexY = array_flip($y);

// test for each value in X whether it is in Y
foreach ($x as $valueX) {
    if (isset($indexY[$valueX])) {
        $result[] = $valueX;
        // remove it from the index so we know which values remain
        unset($indexY[$valueX]);
    }
}

// append remaining values
foreach ($indexY as $valueY => $i) {
    $result[] = $valueY;
}

更新这绝对不是最简洁的解决方案,但其运行时复杂度为Ο( n ),与此处提到的其他{{3}相反},array_intersectarray_diff在内部对数组进行排序,每个数组都在Ο( n ·log n )中。

答案 2 :(得分:1)

<?php

$intersect = array_intersect($x, $y);
$diff = array_diff($y, $x);
$result = array_merge($intersect, $diff);

?>