2014-08-29 32 views
1

陣列我有一個這樣的陣列:排序使用存儲

$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] 
]; 

我需要一個算法,使數組,字符串delimitered,或任何類型的輸出,包含對數組進行排序的步驟。

主要在PHP中,但我可以從任何語言實現它。

+0

's'是什麼?那應該是一個字符串''s''? – Barmar 2014-08-29 10:04:11

+0

因此,基本上,您想要生成一個類似彙編語言的程序來對給定的數組進行排序嗎? – georg 2014-08-29 10:04:41

+2

使用泡泡排序或快速排序等算法編寫自己的排序函數。每當它交換一對元素時,它應該在'$ output'中添加它正在做的事情。 – Barmar 2014-08-29 10:06:30

回答

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]] 
0

您正在尋找array_maphttp://php.net/manual/fr/function.array-map.php老答案:usorthttp://php.net/manual/fr/function.usort.php):創建一個自定義功能,讓你在找什麼,並與array_map調用它。

+0

他將如何與'usort' ?它沒有定義元素之間的比較關係。 – Barmar 2014-08-29 10:03:44

+0

請你解釋一下這個嗎?如何可以幫助我? – 2014-09-01 22:17:22

+0

對不起,就像我修改過的,我正在討論'array_map'。 – Kevin 2014-09-01 23:42:09

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]