所以,我拥有所有搜索算法,并且我向每个算法发送随机的20000个数字,试图找出每个算法需要多长时间。
public void functionsForSorts(int[] array)
{
Stopwatch sw = new Stopwatch();
long elapsedTime = sw.ElapsedTicks;
if (array.Length == 20000)
{
sw.Start();
BubbleSort.Bubble(array);
sw.Stop();
elapsedTime = sw.ElapsedMilliseconds;
label1.Text += "\t" + elapsedTime.ToString() + " miliseconds ";
Application.DoEvents();
sw.Restart();
SelectionSort.Selection(array);
sw.Stop();
elapsedTime = sw.ElapsedMilliseconds;
label2.Text += "\t" + elapsedTime.ToString() + " miliseconds ";
Application.DoEvents();
sw.Restart();
InsertionSort.Insertion(array);
sw.Stop();
elapsedTime = sw.ElapsedMilliseconds;
label3.Text += "\t" + elapsedTime.ToString() + " miliseconds ";
Application.DoEvents();
sw.Restart();
MergeSort.mergeSort(array, 0, array.Length - 1);
sw.Stop();
elapsedTime = sw.ElapsedMilliseconds;
label4.Text += "\t" + elapsedTime.ToString() + " miliseconds ";
Application.DoEvents();
sw.Restart();
ShellSort.Shell(array);
sw.Stop();
elapsedTime = sw.ElapsedMilliseconds;
label5.Text += "\t" + elapsedTime.ToString() + " miliseconds ";
Application.DoEvents();
sw.Restart();
QuickSort.Quicksort(array, 0, array.Length - 1);
sw.Stop();
elapsedTime = sw.ElapsedMilliseconds;
label6.Text += "\t" + elapsedTime.ToString() + " miliseconds ";
Application.DoEvents();
}
问题是秒表不会给出正确的结果,它适用于冒泡排序,选择排序和合并排序,但我不知道为什么,它总是为insertionsort写0,即使它有适当的值而debugging.and它没有为shell排序和快速排序提供适当的值。
关于这一点的另一个尴尬的部分,当我评论出气泡和选择排序时,插入将给出正确的结果,对于所有算法都是如此,如果我按顺序将它们作为第一个,我得到了正确的结果,我展示了这个对我的朋友们来说,他们也没有任何线索,这根本没有意义......
答案 0 :(得分:4)
这是不可能的
是什么让你得出结论认为这是不可能的?请记住,即使Stopwatch
精度有限。 0
并不意味着“它花了很长时间”;它可能意味着“没有足够的时间来注册可用的精度”。要在快速的事物上获得合理的计时,您通常需要在定时区域内的循环中多次执行(意味着:数千甚至数百万次)。没有看到Insertion
的作用,我们知道这很好。
就个人而言,我会使用:
sw = Stopwatch.StartNew();
// probably loop here!!
i5k.Insertion(array);
sw.Stop();
答案 1 :(得分:4)
如果数组已经排序,那么您的插入排序可能无关,并且在不到1毫秒内完成。如果您之前的排序使数组排序,那么这是可能的。
(编辑 - 我显然很难输入“可能”这个词,而不是“可能”...更正。)
答案 2 :(得分:2)
elapsedTime = sw.ElapsedMilliseconds;
毫秒是很长的一段时间,现代处理器可以在几毫秒内执行数百万条指令。足够让你的插入排序在不到一毫秒内完成,所以ElapsedMilliseconds返回0.避免丢弃你从秒表中获得的分辨率,改为使用它的Elapsed属性。
答案 3 :(得分:1)
不要使用Stopwatch.ElapsedMilliseconds,如果操作时间不到1毫秒,则返回0。
使用Stopwatch.ElapsedTicks代替。并且也做了Marc上面所说的。