混合,然后再次重新排序.Net 2.0中的数组

时间:2012-02-06 16:43:14

标签: c# arrays sorting

我想我遇到了一个有趣的问题 - 如何加扰,然后撤消阵列上的争夺。请记住,需要使用.Net 2.0来完成。

我的思维过程如下所示:

  1. 不知何故,为数组中的每个项目签署某种索引
  2. 随机化数组
  3. 使用索引重新排序数组
  4.   

    byte [] b = new byte [] {1 => 33,2 => 19,3 => 41,n => N}
      b.Sort();

    数组现在可能如下所示:

    byte[] b = new byte[] {3=>41,2=>19,1=>33,n=>NN ... etc.};
    

    请有人告诉我,我想在这里做什么是可能的,如果确实有可能,请指出我正确的方向。

    谢谢,

    埃文

2 个答案:

答案 0 :(得分:7)

我建议使用Fisher-Yates算法和给定的整数键对数组进行混洗,然后取消对其进行疏忽。密钥可以是固定的或随机的,但对于两个操作必须是相同的数字才能检索原始数组。

解密比Scramble稍微复杂一点,因为必须使用使用相同种子初始化的Random生成交换序列,然后以相反的顺序应用。

void Scramble<T>(T[] array, int key)
{
    var random = new Random(key);
    for (int i = array.Length; i > 1; i--)
    {
        Swap(array, random.Next(i), i - 1);
    }
}

void Unscramble<T>(T[] array, int key)
{
    var random = new Random(key);
    var swaps = new List<int>(array.Length);
    for (int i = array.Length; i > 1; i--)
    {
       swaps.Add(random.Next(i));
    }
    swaps.Reverse();
    for (int i = 0 ; i < swaps.Count; ++i)
    {
        Swap(array, swaps[i], i + 1);
    }
}

void Swap<T>(T[] array, int i1, int i2)
{
    T tmp = array[i2];
    array[i2] = array[i1];
    array[i1] = tmp;
}

答案 1 :(得分:1)

为什么不在随机化之前复制原始数组?