2016-06-06 1 views
1

Предположим, что сравнение элементов в массиве принимает O (n), возможно ли отсортировать массив в O (n), когда элементы первой половины массива меньше другой половины?Будет ли работать сортировка массива в O (n), когда половина массива меньше другой?

Я думаю, да, это упростит сортировку, потому что элементы arent смешиваются так сильно. Поэтому мы позаботимся о первом тайме, меньшем, просто сравниваем один элемент с другим и сортируем. Затем сделайте то же самое со второй половиной. Разве это не работает в O (n)?

+0

Когда вы имеете в виду, что первая половина меньше, чем другая половина, вы имеете в виду, что все элементы меньше, чем во второй половине? Эти элементы уже отсортированы самостоятельно или просто распределены случайно? IOW: это так: {1, 2, 3, 4, 5, 400, 100, 200, 500, 300} или вот так: {5, 2, 1, 4, 3, 400, 100, 200, 500 , 300}? Если это похоже на второе, я бы предположил, что нет никакой пользы для сортировки. –

+0

@blahfunk: Да, все элементы меньше, чем во второй половине. Элементы не сортируются сами по себе. Если бы они были тогда, все элементы были бы отсортированы от начала до конца, верно? : D – roblind

+0

Вы могли бы _possibly_ оптимизировать его (но не обязательно), если бы знали, что он будет разбиваться по середине во время программирования. Но, скорее всего, это будет анти-оптимизация, чтобы попытаться что-то сделать во время выполнения. Итак, это похоже на XY Problem-ish. Это также зависит от таких факторов, как алгоритм сортировки, который вы используете, или если вы сортируете новый контейнер (который не является точно _sorting_, но может принести пользу). –

ответ

0

Итак, вы разбиваете массив на две части, причем все предметы в первой части меньше, чем самый маленький предмет во второй части. Затем вы сортируете отдельные фигуры? Это звучит подозрительно, как работает Quicksort.

И, нет, вы не можете вообще сортировать массив в O (n). Давно известно, что нижняя граница сортировки по сопоставлению равна O (n log n). См. https://en.wikipedia.org/wiki/Comparison_sort#Number_of_comparisons_required_to_sort_a_list для краткого обзора причин. Вы можете получить подробные ссылки оттуда.

0

Я не получаю это утверждение:

Скажем, сравнение элементов в массиве занимает O (N)

Оставляя это утверждение: Нет, это не O (п). Вы можете сделать так, как вы упомянули, но нам не дают никакой информации об элементах в обеих половинах. Итак, для сортировки первой половины вам нужно (n/2) .log (n/2) время и аналогично для второй половины вам нужно (n/2) .log (n/2) time. Таким образом, для всего массива вам понадобится n.log (n/2), который является O (nlogn).