Нерекурсивная сортировка слиянием пространств O (N)

Я кодирую алгоритм нерекурсивной сортировки слиянием на Java. Я должен убедиться, что этот метод работает как нерекурсивный, а сложность пространства должна быть O (N)

Полученная мной инструкция: вы можете использовать пространство O (N) (в дополнение к входному массиву), и ваш алгоритм должен иметь такое же время работы, что и рекурсивная сортировка слиянием.

вот мой код.

Я хочу убедиться в рекурсивности, а также в пространстве O (N). Если есть способ лучше, дайте мне знать.

private static void merge(Integer[] a, Integer[] tmpArray, int leftPos, int rightPos, int rightEnd) {
       int leftEnd = rightPos - 1;
       int tmpPos = leftPos;
       int numElements = rightEnd - leftPos + 1;

       // Main loop
       while(leftPos <= leftEnd && rightPos <= rightEnd) {
           if( a[leftPos] <= a[rightPos ]) {
               tmpArray[tmpPos++] = a[leftPos++];
           } else {
               tmpArray[tmpPos++] = a[rightPos++];
           }
       }

       while( leftPos <= leftEnd ) {   // Copy rest of first half
           tmpArray[tmpPos++] = a[leftPos++];
       }

       while( rightPos <= rightEnd ) { // Copy rest of right half
           tmpArray[tmpPos++] = a[rightPos++];
       }

       // Copy tmpArray back
       for( int i = 0; i < numElements; i++, rightEnd-- ) {
           a[rightEnd] = tmpArray[rightEnd];
       }
   }

   public static void mergeSortB(Integer[] inputArray) {

     Integer[] tempArray = new Integer[inputArray.length];

     for(int i = 1; i<inputArray.length; i=i*2) {
       for(int j=i; j<inputArray.length; j=j+i*2) {
         int k = j+i-1;
         if(inputArray.length<j + i) {
           k = inputArray.length -1;
         }
         //call the merge method(non recursive)
        merge(inputArray, tempArray, j-i,j, k);
       }
     }

   }

person Daniel Park    schedule 06.12.2016    source источник
comment
Что ты имеешь в виду, O (n)? Сортировка слиянием имеет временную сложность O (NlogN).   -  person xiaofeng.li    schedule 07.12.2016
comment
Я получил инструкцию от профессора. Вы можете использовать пространство O (N) (в дополнение к входному массиву), и ваш алгоритм должен иметь такое же время работы, что и рекурсивная сортировка слиянием. Я не понимаю, что это означало. Я думал, что метод должен быть bigO (N), но, возможно, нет.   -  person Daniel Park    schedule 07.12.2016
comment
Вы можете попробовать алгоритмы, не основанные на сравнении: cs.bgu.ac .il / ~ ds132 / wiki.files / ds132_ps11.pdf   -  person Veneet Reddy    schedule 07.12.2016
comment
Инструкции означают, что метод должен иметь временную сложность O (n * log (n)) и пространственную сложность O (n).   -  person that other guy    schedule 07.12.2016
comment
Мой код соответствует этому?   -  person Daniel Park    schedule 07.12.2016
comment
Да, похоже. Единственные данные, зависящие от размера, которые вы выделяете, - это временный массив размера N, так что это тривиальное пространство O (n). Затем вы линейно просматриваете каждый неперекрывающийся подсписок размера X, где X удваивается каждый раз (так что log2 (n) раз), давая время O (n * log (n)).   -  person that other guy    schedule 07.12.2016
comment
Спасибо!! и поскольку метод вызывает merge вместо mergeSortB, он также не является рекурсивным, верно?   -  person Daniel Park    schedule 07.12.2016


Ответы (1)


Ваш код выглядит нормально. Тем не менее, вы можете создать тест (и при необходимости отладить), чтобы убедиться, что ваш код работает. Но сортировка слияния имеет Big(O)== NlogN, а не N.

person Saber Alex    schedule 06.12.2016
comment
Я добавил инструкцию, которая есть у меня от профессора. Вы можете использовать пространство O (N) (в дополнение к входному массиву), и ваш алгоритм должен иметь то же время работы, что и рекурсивная сортировка слиянием. Интересно, это означает, что цикл должен быть большимO (N) - person Daniel Park; 07.12.2016
comment
Инструмент отладчика обычно имеет способ показать переменную в вашем стеке, - person Saber Alex; 07.12.2016