这就要判断逆排序的奇偶性了。
如果打乱后的排序奇偶性跟打乱前的是一样的,就能拼得回来。
就像12345678是偶排序,如果打乱后也是偶排序。就能拼得回来。
排序奇偶性是怎样出来的呢?
看:
12345678
1前面没有比1大的:0
2前面没有比2大的:0
3前面没有比3大的:0
4前面没有比4大的:0
5前面没有比5大的:0
6前面没有比6大的:0
7前面没有比7大的:0
8前面没有比8大的:0
0+0+0+0+0+0+0+0=0
0为偶数,所以排序为偶排序
再看看21345678
2前面没有比2小的:0
1前面有1个比1大的(就是2啦):1
3前面没有比3大的:0
4前面没有比4大的:0
5前面没有比5大的:0
6前面没有比6大的:0
7前面没有比7大的:0
8前面没有比8大的:0
0+1+0+0+0+0+0+0=1
1为奇数,所以排序为奇排序,跟没打乱之前的12345678的排序奇偶性不同,所以就拼不回来了。
现在随机打乱看看能不能拼得回
假如打乱后为:23514876
2前面没有比2大的:0
3前面没有比3大的:0
5前面没有比5大的:0
1前面有3个比1大的(2,3,5):3
4前面有1个比4大的(5):1
8前面没有比8大的:0
7前面有1个比7大的(8):1
6前面有2个比6大的(7,8):2
0+0+0+3+1+0+1+2=7
7为奇数,所以排序为偶排序,跟12345678的排序奇偶性不同,所以是拼不回来的。
所以,只要判断一下排序的奇偶性就行了,如果是奇排序就拼不回来了,就必须重新打乱。
我不知道你用什么语言编写,下面是我用vb写的,用来判断排序奇偶性,你参考一下(我是从0开始的,0~7)
S()是打乱后的数组
Dim g As Integer
Dim f As Integer
For i = 1 To 7
For g = 0 To i - 1
If s(g) > s(i) Then f = f + 1
Next g
Next i
最后用 f mod 2判断 f是不是偶数,如果是就能拼得回来。如果不是,就必须重新打乱了。
打了半天,自己迷迷糊糊的,你看不懂再问我吧。