Как рассчитать временную сложность модифицированной быстрой сортировки, смешанной с сортировкой по вставке?

#c #sorting #time-complexity

#c #сортировка #временная сложность

Вопрос:

Я знаю, как рассчитать сложность только для быстрой сортировки и сортировки по вставке, но когда я смешиваю их…

Вот код:

 #define THRESHOLD 50

// regular insertion sort
void isort(int *array, size_t n) {
  int key, i, j;
  for(j = 1; j < n; j  ){
    key = array[j];
    i = j - 1;
    while (array[i] > key amp;amp; i>=0) {
      array[i   1] = array[i];
      i--;
    }
    array[i   1] = key;
  }
}

// modified quick sort
static void sort(int *array, int start, int end) {
  if (end - start > THRESHOLD) {
    int pivot = array[start];
    int l = start   1;
    int r = end;
    while(l < r) {
       if (array[l] < pivot) {
          l  = 1;
       } else if ( array[r] >= pivot )  {
          r -= 1;
       } else {
          swap(amp;array[l], amp;array[r]);
       }
    }
    if (array[l] < pivot) {
      swap(amp;array[start], amp;array[l]);
      l -= 1;
    } else {
      l -= 1;
      swap(amp;array[start], amp;array[l]);
    }

    sort(array, start, l);
    sort(array, r, end);
  } else {
    isort(array, end - start   1);
  }
}
  

Подводя итог: это рекурсивная быстрая сортировка, за исключением того, что, когда входящий вектор ниже порогового значения, используется сортировка по вставке.

Как мне рассчитать временную сложность для наилучшего, среднего и наихудшего случаев?

Комментарии:

1. каково значение THRESHOLD

2. Я обновил код!

3. Сложность в лучшем случае совершенно бессмысленна.

4. Yoursort по-прежнему равен O (n ^ 2) в худшем случае.

Ответ №1:

Часть, которая сбивает с толку, заключается в том, что, когда размер раздела достигает 50 или меньше, мы выполняем сортировку по вставке. Конкретное значение (50) не так важно, поэтому я переключу его на 64 для немного более простых вычислений. При выполнении рекурсивной формулы для среднего случая qsort мы предполагаем, что сортировка раздела размером 64 требует операций log (64) * 64, что, по-видимому, является константой. Обратите внимание, что 64 является константой, и сортировка 64 элементов с помощью insert займет порядок O (64 * 64) даже в худшем случае. Это все еще константа. Таким образом, мы изменим только константу сложности асимптотического поведения qsort, но не будем изменять саму функцию.

При этом я хочу сказать, что выполнение другого алгоритма ниже фиксированного порога может изменить постоянный коэффициент вашего алгоритма, но это не изменит его сложность. Это останется неизменным для всех случаев, которые вы упомянули.