Я знаю, что когда IntroSort вызывается с чем-то вроде T [], скажем Integer [] x; Он будет сортировать массив до тех пор, пока рекурсивная глубина не будет слишком большой (в большинстве реализаций будет 0), а затем переключится на HeapSort. Тем не менее, я пытаюсь вызвать модифицированный MergeSort, когда рекурсивная глубина становится 2log2n. Модифицированный MergeSort использует только временный массив, который вдвое меньше размера исходного массива, просто чтобы сохранить немного времени и пространства. Во всяком случае, я в основном скопировал все QuickSort, за исключением того, что я добавил проверку depth_limit, прежде чем он рекурсивно вызовет.Переход от IntroSort к MergeSort
private void quicksort(T[] items, int left, int right) {
int depth_limit = (int) (2*Math.log(items.length));
if(depth_limit == 0)
{
mergesorter.sort(items, left, right);
return;
}
int pivotindex = findpivot(items, left, right);
// curr will be the final position of the pivot item.
int curr = partition(items, left, right, pivotindex);
if ((curr - left) > 1) {
quicksort(items, left, curr - 1); // Sort left partition
}
if ((right - curr) > 1) {
quicksort(items, curr + 1, right); // Sort right partition
}
}
Я думаю, что это будет работать, так как я считаю,
depth_limit = 2 * log2 (п), где п число входов
Так что мой вопрос, где я могу проверить глубину рекурсии, чтобы переключиться на MergeSort, и я правильно вычислил свою глубину?