从多个预排序数组创建排序数组

时间:2015-03-12 12:56:49

标签: php arrays performance sorting

我想从可变数量的预排序数组中创建一个排序数组。

鉴于{A1, ..., An}是预先排序的数组,我想创建At,它是{A1, ..., An}的组合,并以相同的方式排序。

示例:

Given :
A1 = [2, 4, 9, 16]
A2 = [-3, 4, 98, 116]
...
An = [1, 7, 17, 76, 512]

I would like :
At = [-3, 1, 2, 4, 4, 9, 16, 17, 76, 98, 116, 512] 

计算此数组的最有效方法是什么?

由于

3 个答案:

答案 0 :(得分:1)

这很简单。我们有A1..AN - 预先排序的列表和相同数量的索引I1..IN设置为零(对于从零开始的列表)。现在我们需要从中形成合并列表。为此,我们需要从所有这些列表中找到最小(或最大取决于什么是初始排序顺序)元素。很明显,这是A1 [I1] A2 [I2] .. AN [IN]元素之一。所以我们只需要浏览所有这些元素并选择最小的元素。让我们说它是A2中的元素。我们将它放入我们的新大名单并增加I2。现在我们和开头的情况相同,应该重复所有这些步骤,或者如果所有列表都用完就停止。

示例:

A1 = [1, 2, 6]
A2 = [2, 4, 5]

A = []
I1 = 0
I2 = 0
-------------
A = [1]
I1 = 1
I2 = 0
-------------
A = [1, 2]
I1 = 2
I2 = 0
-------------
A = [1, 2, 2]
I1 = 2
I2 = 1
...

答案 1 :(得分:0)

我已经实现了一个按我想要的功能。

您如何看待性能?你有任何改进建议吗?

排序功能:

function sortPreSortedArrays($arrays, $comparisonFunction, $order = 'asc')
{
    $sortedArray = array();

    /* Sort */

    while(sizeof($arrays) !== 0)
    {
        /* Find the greatest value */

        $max = true;
        $keyMax = -1;

        foreach($arrays as $key => $array)
        {
            if($max === true || $comparisonFunction(end($array), $max))
            {
                $max = end($array);
                $keyMax = $key;
            }
        }

        /* Take the greatest value */

        array_push($sortedArray, array_pop($arrays[$keyMax]));
        if(sizeof($arrays[$keyMax]) === 0) unset($arrays[$keyMax]);
    }

    /* Return */

    if($order === 'asc')
        return array_reverse($sortedArray);
    else
        return $sortedArray;

比较功能:

function compareLogArrayDate($log1, $log2)
{
    $t1 = $log1['date'];
    $t2 = $log2['date'];

    return ($t1 > $t2) ? true : false;
}

编辑:为了改善效果,我尝试使用效率最高的数组函数(array_pop O(1)而不是array_shit {{1然而,我仍在使用O(n)。:|

答案 2 :(得分:0)

$A1 = [2, 4, 9, 16];
$A2 = [-3, 4, 98, 116];
$An = [1, 7, 17, 76, 512];


// create arrays of ith elements
$return = call_user_func_array('array_map', [null, $A1, $A2, $An]);
// sort arrays
array_walk($return, 'sort');
// create new arrays
$return = call_user_func_array('array_merge', $return);
// remove null values lefted after first operation
$return = array_filter($return, 'is_scalar');
var_dump($return);