我想从可变数量的预排序数组中创建一个排序数组。
鉴于{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]
计算此数组的最有效方法是什么?
由于
答案 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);