shellort和insertionsort的运行时间根据执行顺序而变化

时间:2015-12-05 14:41:25

标签: c# sorting datetime

       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;
            }
        }

0 个答案:

没有答案