使用存储对数组进行排序

时间:2014-08-29 10:00:34

标签: php arrays algorithm sorting

我有一个这样的数组:

$a = [2, 1, 1, 2, 3, 1, 3, 2];

我需要使用外部变量对其进行排序。但我需要以下输出:

$output = [
    [0, s],  // Move $a[0] to storage
    [5, 0],  // Move $a[5] to $[0]
    [s, 5],  // Move storage to $a[5]
    [4, s],  // Move $a[4] to storage
    [7, 4],  // Move $a[7] to $a[4]
    [s, 7]   // Move storage to $[7]
];

我需要一个算法来创建数组,分隔字符串或任何类型的输出,包含对数组进行排序的步骤。

主要在PHP中,但我可以从任何语言实现它。

3 个答案:

答案 0 :(得分:2)

如果可能没有那么有效的想法那么有趣:

确定每个元素的计数和排序偏移量:

$a = [2, 1, 1, 2, 3, 1, 3, 2];
$count_and_offset = [1 => [3,0], 2 => [3,3], 3 => [2,6]]

确定排列,

$a_permutation = [5, 2, 3, 4, 8, 1, 7, 6];

枚举周期(http://en.wikipedia.org/wiki/Cyclic_permutation),

(1586)(2)(3)(4)(7)

制作一个列表(示例不是从零开始),

[[6, s]
,[8, 6]
,[5, 8]
,[1, 5]
,[s, 1]]

答案 1 :(得分:1)

您可以使用插入排序(或对其他排序算法执行类似操作,如冒泡排序或快速排序)

伪代码(我从wiki获取)

for i ← 1 to length(A)
    j ← i
    while j > 0 and A[j-1] > A[j]
        swap A[j] and A[j-1]
        j ← j - 1

因此,对于每个交换步骤,您只需要打印

[j , s]
[j - 1,j]
[s , j - 1]

答案 2 :(得分:0)

您正在寻找array_maphttp://php.net/manual/fr/function.array-map.php旧答案:usorthttp://php.net/manual/fr/function.usort.php ):创建一个自定义函数,正在寻找,并用array_map调用它。