IntroSortがT []のようなもので呼び出されたとき、Integer [] x;再帰深度が大きすぎる(ほとんどの実装では0になる)まで配列をソートし、次にHeapSortに切り替えます。しかし、再帰深度が2log2nになったときに、変更されたMergeSortを呼び出そうとしています。修正されたMergeSortは、わずかな時間とスペースを節約するために、元の配列のサイズの半分の一時配列しか使用しません。とにかく、基本的には、再帰的に呼び出す前にdepth_limitチェックを追加した以外は、QuickSortのすべてをコピーしました。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(n)は、nは入力
の数であるので、私の質問があり、信じているので、私は、これが働くだろうと思うだろうMergeSortに切り替えるための再帰の深さと深さを正しく計算していますか?