合并排序的阈值是多少?

时间:2013-04-30 07:14:19

标签: algorithm sorting mergesort insertion-sort

我无法理解合并排序中的阈值,我该如何确定它。 我谷歌但没有结果。谁能为我解释一下? 我想使用合并排序对数组[50000]进行排序,当使用插入排序进行阈值交叉时。

private int[] MergeSort(int[] lst)
    {
        int hl = lst.Length - 0;

        if (hl < 5 || hl < 10 || hl < 15 || hl < 20 || hl < 25 || hl < 30 || hl < 35 || hl < 40 || hl < 45 || hl < 50)
        {
            RunTime run = new RunTime();
            run.X = hl;
            InsertionSort(lst);
            run.Ttime = Process.GetCurrentProcess().TotalProcessorTime.Milliseconds;

                _listRunTime.Add(run);



        }

        if (lst.Length == 1)
            return lst;
        int middle = lst.Length / 2;
        int[] left = new int[middle];
        for (int i = 0; i < middle; i++)
        {
            left[i] = lst[i];
        }
        int[] right = new int[lst.Length - middle];
        for (int i = 0; i < lst.Length - middle; i++)
        {
            right[i] = lst[i + middle];
        }
        left = MergeSort(left);
        right = MergeSort(right);

        int leftptr = 0;
        int rightptr = 0;

        int[] sorted = new int[lst.Length];
        for (int k = 0; k < lst.Length; k++)
        {
            if (rightptr == right.Length || ((leftptr < left.Length) && (left[leftptr] <= right[rightptr])))
            {
                sorted[k] = left[leftptr];
                leftptr++;
            }
            else if (leftptr == left.Length || ((rightptr < right.Length) && (right[rightptr] <= left[leftptr])))
            {
                sorted[k] = right[rightptr];
                rightptr++;
            }
        }
        return sorted;
    }

    private void InsertionSort(int[] arr)
    {
        int i, j, tmp;
        for (i = 1; i < arr.Length; i++)
        {
            j = i;
            while (j > 0 && arr[j - 1] > arr[j])
            {
                tmp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = tmp;
                j--;
            }
        }
    }

我必须使用阈值而不是if (hl < 5 || hl < 10 || hl < 15 || hl < 20 || hl < 25 || hl < 30 || hl < 35 || hl < 40 || hl < 45 || hl < 50)

1 个答案:

答案 0 :(得分:0)

请看这个讨论此主题的问题:Why should Insertion Sort be used after threshold crossover in Merge Sort

基本上,阈值只是一个数字n,这样如果在运行合并排序后有n个元素未被排除,我们就切换到插入排序。我非常暧昧,你可以在你的代码上测试它,看看哪个优化了性能。所以不,除非你尝试一堆不同的值并测试性能,否则无法确定阈值数。

btw不是你的巨大if语句与

完全相同
if(hl < 50)