当前位置: 代码迷 >> C# >> 一个超诡异的有关问题,求解答
  详细解决方案

一个超诡异的有关问题,求解答

热度:18   发布时间:2016-05-05 03:20:50.0
一个超诡异的问题,求解答
2个希尔排序。。代码逻辑完全一样,唯一不同的是,一个是将判断放入for循环时进行(与for同级),另一个是将判断放入for循环的内部。如果不明白请看下面2张图





执行的结果令我吃惊。


我不明白为何差距竟然如此之大,如果知道原由,请告知!
下面是完整代码。



 public static void Main()
        {
            List<int> list = Enumerable.Range(0, 10000).ToList();
            List<int> list2 = Enumerable.Range(0, 10000).ToList();
            Watch(() => { ShellSort1(list); });
            Watch(() => { ShellSort2(list2); });

        }
        public static void ShellSort1(List<int> list)
        {
            for (int step = list.Count / 2; step >= 1; step /= 2)
            {
                for (int i = step; i < list.Count; i++)
                {
                    int j = i;
                    var baseNumber = list[j];
                    for (; j - step >= 0 && baseNumber > list[j - 1]; j -= step)
                    {
                        list[j] = list[j - 1];
                    }
                    list[j] = baseNumber;
                }
            }
        }
        public static void ShellSort2(List<int> list)
        {
            for (int step = list.Count / 2; step >= 1; step /= 2)
            {
                for (int i = step; i < list.Count; i++)
                {
                    int j = i;
                    var baseNumber = list[j];
                    for (; j - step >= 0; j -= step)
                    {
                        if (baseNumber > list[j - 1])
                            list[j] = list[j - 1];
                    }
                    list[j] = baseNumber;
                }
            }
        }
        public static void Watch(Action action)
        {
            Stopwatch watch = new Stopwatch();
            watch.Start();
            action();
            watch.Stop();
            Console.WriteLine(watch.ElapsedMilliseconds);
        }

------解决思路----------------------
引用:
2个希尔排序。。代码逻辑完全一样,...


你确定逻辑完全一样?
在for上面的判断,一旦为假,循环就中止了。
在里面的判断,不会中止循环。

------解决思路----------------------
LZ你是来散分的吧。。。

正如楼上所说。。这问题。。唉。。
------解决思路----------------------
j - step >= 0 && baseNumber > list[j - 1] //结束条件,话说你确认这样子对的?

j - step >= 0//结束条件
if (baseNumber > list[j - 1]){ list[j] = list[j - 1];}//内部判断更换
  相关解决方案