下方是洗牌算法的C#实现,重点在于ArrayRandomization方法的内部逻辑,尤其是循环内部使用的第一行代码,第二行就是使用替换的方式将两个数组中指定索引的值进行简单地交换即可,思路来源:
using System;
namespace learnAlgos
{
class Program
{
static void Main(string[] args)
{
Program program = new Program();
int[] arr = new int[5] { 1, 2, 3, 4, 5 };
int[] newArray = program.ArrayRandomization(arr);
//Test
for (int i = 0; i < newArray.Length; i++)
{
Console.WriteLine(newArray[i]);
}
}
int GetRandomNumber(int lowerValue, int upperValue)
{
Random random = new Random();
int randomNumber = random.Next(lowerValue, upperValue + 1);
// Console.WriteLine("The random number created is {0}", randomNumber);
return randomNumber;
}
//// 必须使用ref传入地址,改变原来变量的值,而不是作用域内的变量x和y。
//// ref 是“有进有出”; out 是“只出不进”。
void Swap(ref int x, ref int y)
{
int temp = 0;
temp = x;
x = y;
y = temp;
}
//核心算法
int[] ArrayRandomization(int[] iArray)
{
int randomNumber = 0;
for (int i = 0; i < iArray.Length - 1; i++)
{
randomNumber = GetRandomNumber(i, iArray.Length - 1);
Swap(ref iArray[i], ref iArray[randomNumber]);
}
return iArray;
}
}
}
/// ref 和 out 关键字用法回顾
/*
ref 关键字使参数按引用传递。
其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。
若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
out 关键字会导致参数通过引用来传递。
这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。
若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。
*/