前几天面试,遇到这么一个问题,曾经做接触过类似问题,当时并没有太在意性能,当时也就按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();
        }
    }
CSharp 数组 性能 最后修改于 2011-04-30 02:04:41
上一篇