我有一个这样的数组:
$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中,但我可以从任何语言实现它。
答案 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_map
:http://php.net/manual/fr/function.array-map.php(旧答案:usort
:http://php.net/manual/fr/function.usort.php ):创建一个自定义函数,正在寻找,并用array_map调用它。