2013-12-01 2 views
2

Для домашнего задания меня попросят отсортировать массив bools с использованием метода, который использует O (1) пространство и O (N) временную сложность. Могут ли предлагаться какие-либо подсказки? Я думал о чем-то по сводному методу алгоритма быстрой сортировки. -Спасибо!Сортировка booleans, O (N) time, O (1) space

+0

Подсказка: поиск «ведро рода» – doynax

+0

Ваша мысль о методе поворота в основном способ сделать это – aaronman

+0

Мысль о том, что, хотя блочная сортировка будет использовать O (N) пространства – bensherms

ответ

8
  1. Держите указатель спереди и сзади.
  2. проверить текущий передний индекс, если это ложный увеличиваем передний индекс
  3. , если это правда своп с индексом обратно и уменьшает индекс назад
  4. продолжить с шагами 2 и 3 до передних и задних индексов равны другие
+1

действительный, эффективный, но более простой, чем простой подсчет, а затем назначает подход – RichardPlunkett

+2

@RichardPlunkett это практически то же самое, что и раздел в qsort, если вы не можете указать, что вы не должны быть программистом, также он делает только один проход – aaronman

5

Если у вас есть массив булевых, вы можете просто считать (ложные или ) значений верно. Предположим, что этот результат равен k. Затем вы устанавливаете первые k элементов массива на true, а остальные false.

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

2

Поскольку логические значения имеют только два возможных значения, вы можете просто подсчитать «истинные» и «ложные» s и изменить исходный массив на месте, чтобы сначала вы поместили в него соответствующее количество значений false, затем заполните остальные true. Это O(n) во времени и O(1) в космосе, если требуется. код C следующим образом:

void sortbool(int *b, size_t n) 
{ 
    size_t k = 0; 
    for (size_t i = 0; i < n; i++) { 
      if (!b[i]) 
        k++; 
    } 

    for (size_t i = 0; i < n; i++) { 
      b[i] = !(i < k); 
    } 
} 
Смежные вопросы