前几天面试,遇到这么一个问题,曾经做接触过类似问题,当时并没有太在意性能,当时也就按Rc1那么写的,当问道我性能的时候我才想到,这么写性能太低了,当时并没有想出更好的办法,后来找到一种打乱数组位置的方法,即洗牌,通过测试,性能差的不一点半点,数值越大,差别越大,大的有些恐怖啊……
class Program { //使用循环判断 //在判断是否重复会用到rD方法去循环判断,还有使用while混换,使循环次数也不确定,性能过低 class Rc1 { private int[] num; private int n; public Rc1(int n) { this.n = n; num = new int[n]; } public bool rD(int ib) //判断之前是否有重复 { for (int i = 0; i < n; i++) { if (num[i] == ib) { return true; } } return false; } public void rS() { Stopwatch watch = new Stopwatch(); Console.WriteLine("Rc1开始执行"); watch.Start(); Random r = new Random(); int d = r.Next(1, n); for (int i = 0; i < n; i++) { while (rD(d)) { d = r.Next(1, n); } } watch.Stop(); Console.WriteLine("Rc1执行结束 用时:{0}ms", watch.ElapsedMilliseconds); } } //使用洗牌算法 //先按顺序存入数组,然后去打乱顺序,只做两次for循环 class Rc2 { private int[] num; private int n; public Rc2(int n) { this.n = n; num = new int[n]; } public void rS() { Stopwatch watch = new Stopwatch(); Console.WriteLine("Rc2开始执行"); watch.Start(); Random r = new Random(); int d = r.Next(1, n); int temp; for (int i = 0; i < n; i++) { num[i] = i + 1; } for (int i = 0; i < n; i++) { int b = r.Next(0, n); temp = num[b]; num[b] = num[i]; num[i] = temp; } watch.Stop(); Console.WriteLine("Rc2执行结束 用时:{0}ms",watch.ElapsedMilliseconds); } } static void Main(string[] args) { int count = 0;//自己定义数组大小 Rc1 r1 = new Rc1(count); Thread thread1 = new Thread(new ThreadStart(r1.rS)); thread1.Start(); Rc2 r2 = new Rc2(count); Thread thread2 = new Thread(new ThreadStart(r2.rS)); thread2.Start(); Console.Read(); } }