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

本文关键字:数组 新排序 排序 然后 Net 混合 | 更新日期: 2023-09-27 18:22:36

我想我遇到了一个有趣的问题——如何对数组进行加扰,然后撤消加扰。请记住,这需要使用.Net 2.0来完成。

我的思考过程如下所示:

  1. 不知怎的,为数组中的每个项签署某种索引
  2. 随机化阵列
  3. 使用索引对数组重新排序

byte[]b=新字节[]{1=>33,2=>19,3=>41,n=>n}
b.排序();

阵列现在可能是这样的:

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

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

谢谢,

Evan

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

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

解扰比加扰稍微复杂一点,因为交换序列必须使用用相同种子初始化的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;
}

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