1/ DateTime before = DateTime.Now;
2/ shellSort(List1);
3/ DateTime after = DateTime.Now;
4/ Console.WriteLine(after - before);
5/
6/ before = DateTime.Now;
7/ insertionSort(List2);
8/ after = DateTime.Now;
9/ Console.WriteLine(after - before);
我试图比较两种不同排序算法的运行时间。这里的List1等于List2。我期望shell排序比插入排序更快但是虽然第一个WriteLine不同,但它通常打印类似于这个= 00:00:00.0035037。然而,第二个打印00:00:00或小于第一个打印的东西。我想也许插入排序更适合List的当前状态,但即使我换掉第7行和第2行我仍然得到相同的结果。是什么造成的?为什么第二个执行的函数运行得更快?或者我完全错误地使用日期? 编辑:我在另一篇文章中建议使用秒表而不是DateTime类。结果几乎相同。第二个通常运行得更快但是时不时地比第一个慢。我还使用了预先编写的shellort代码来查看我的实现是否很糟糕,但这也是一个死胡同。
根据要求,shellort和insertionsort实现
static void shellSort(List<int> numbers) // Implementation i found online
{
int i, j, increment, temp;
increment = 3;
while (increment > 0)
{
for (i = 0; i < numbers.Count ; i++)
{
j = i;
temp = numbers[i];
while ((j >= increment) && (numbers[j - increment] > temp))
{
numbers[j] = numbers[j - increment];
j = j - increment;
}
numbers[j] = temp;
}
if (increment / 2 != 0)
increment = increment / 2;
else if (increment == 1)
increment = 0;
else
increment = 1;
}
}
public static void insertionSort(List<int> numbers)
{
int i = 0;
while (i != numbers.Count)
{
int k = i;
while (k != 0 && numbers[k] < numbers[k - 1])
{
int temp = numbers[k - 1];
numbers[k - 1] = numbers[k];
numbers[k] = temp;
k--;
}
i++;
}
}
这也是我对shellsort的实现
public static void shellSort(List<int> Liste)
{
int n = Liste.Count;
int gap = (Liste.Count - 1) / 2;
while (gap > 0)
{
int i = 0;
for(int k = gap; k < n; k++) {
int p = i;
int m = k;
while (p >= 0)
{
if (Liste[p] > Liste[m])
{
int temp = Liste[p];
Liste[p] = Liste[m];
Liste[m] = temp;
m = p;
}
else
break;
p = p - gap;
}
i++;
}
gap = gap / 2;
}
}