我无法理解合并排序中的阈值,我该如何确定它。 我谷歌但没有结果。谁能为我解释一下? 我想使用合并排序对数组[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)
。
答案 0 :(得分:0)
请看这个讨论此主题的问题:Why should Insertion Sort be used after threshold crossover in Merge Sort
基本上,阈值只是一个数字n,这样如果在运行合并排序后有n个元素未被排除,我们就切换到插入排序。我非常暧昧,你可以在你的代码上测试它,看看哪个优化了性能。所以不,除非你尝试一堆不同的值并测试性能,否则无法确定阈值数。
btw不是你的巨大if语句与
完全相同if(hl < 50)