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);
}
------解决思路----------------------
你确定逻辑完全一样?
在for上面的判断,一旦为假,循环就中止了。
在里面的判断,不会中止循环。
------解决思路----------------------
LZ你是来散分的吧。。。
正如楼上所说。。这问题。。唉。。
------解决思路----------------------
j - step >= 0 && baseNumber > list[j - 1] //结束条件,话说你确认这样子对的?
j - step >= 0//结束条件
if (baseNumber > list[j - 1]){ list[j] = list[j - 1];}//内部判断更换