C#代码如下:
public static void Swap(List<int> array, int i, int j)
{
array[i] = array[i] + array[j];
array[j] = array[i] - array[j];
array[i] = array[i] - array[j];
}
本来打算的是,不想用新得变量去完成数组中两个数的交换,抖个小机灵,结果出错了,下列代码是准备随机打乱一个既定数组的顺序的:
var list0 = new List<int> { 1, 2, 3, 4, 5, 6, 7 };
var random = new Random();
int len = list0.Count;
for(int i =0; i<len; i++)
{
int rand_idx = random.Next(i, len);
Swap(list0, i, rand_idx);
}
foreach(var a in list0)
{
Console.Write($"{a} ");
}
Console.WriteLine("\n");
结果输出的结果如下:
那问题出在哪里呢?其实就是在交换位置时,如果连个被交换的数的位置一样,按照上诉写法,就会出现交换后值为0的情况,因为i和j一样,在进行aarray[j] = array[i] - array[j];;这一步的时候,数组该位置的就已经被置0了,所以如果为了写起来方便,可以用最直接的办法:
public static void Swap(List<int> array, int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
哈哈,当然也可以
public static void Swap(List<int> array, int i, int j)
{
int a = array[i];
int b = array[j];
a = a + b;
b = a - b;
a = a - b;
array[i] = a;
array[j] = b;
}
这样强行做了,但是引入了两个新得临时变量,就更丑了,所以建议还是用内置的交换函数或者最简单的那种吧。