Анимация
JavaScript
|
Главная Библионтека Перемещение элементов в начало Bidirectionallterator partition (Bidirectionallterator йед, Bidirectionallterator encf. UnaryPredicate op) Bidirectionallterator stable partition (Bidirectionallterator beg. Bidirectionallterator end. UnaryPredicate op) О Оба алгоритма перемещают в начало интервала [beg.end) все элементы, для которых унарный предикат ор{е1ет) возвращает true. О Оба алгоритма возвращают первую позицию, для которой opQ возвращает false. О Отличие partitionO от stable partitionO заключается в том, что stablepartitionO сохраняет относителытый порядок следования элементов (как соответствующих, так и не соответствующих критерию), О Алгоритм может использоваться для разбиения элементов на две группы в соответствии с критерием сортировки. Аналогичной возможностью обладает алгоритм nth eementO. Отличия этих алгоритмов от nth element() описаны на с. 330. О Предикат ор не должен изменять свое состояние во время вызова. За подробностями обращайтесь на с. 303. О Сложность: □ PartitionO - линейная (numberOfElements вызовов ор() и не более питЬег-OfElements/2 обменов); □ StablejDartitionO - линейная при наличии дополнительной памяти (numberOfElements вызовов орО и обменов), nxlog(n) в противном случае (питЬег-OfElementsy.log(numberOfElements) вызовов ор{)). Следующая программа демонстрирует использование алгоритмов partitionO и stable partitionO, а также различия между ними: algo/partl.срр finclude "algostuff.hpp" using namespace std; int mainO { vector<int> colli; vector<int> C0112: INSERT ELEMENTS(colll.l.9); INSERT ELEMENTS(coll2.1.9): PRINTJLEMENTS (col 11. "col 11: ): PRINT ELEMENTS(col 12."col 12: "): cout « endl: Перемещение всех нечетных элементов в начапо vector<int>::iterator posl. pos2; posl = part1tion(colll.beginO. colli.end(). Интервал notl(bind2nd(modulus<int>(),2))); Критерий pos2 = stable partition(coll2.beginO . coll2.endO. Интервал notl(bind2nd(tiiodulus<int>(),2))): Критерий Вывод коллекций и первого нечетного элемента PRINT ELEMENTSCcol11."col 11; "): cout « "first odd element: " « *posl « endl; PRINT ELEMENTS(coll2."coll2: "): cout « "first odd element: " « *pos2 « endl; Результат выполнения программы выглядит так: colli: 12 3 4 5 6 7 8 9 C0112: 12 3 4 5 6 7 8 9 colli: 8 2 6 4 5 3 7 1 9 first odd element: 5 C0112: 246813679 first odd element: 1 Как видно из приведенного примера, stable partition(), в отличие от partition(), сохраняет относительный порядок следования четных и нечетных элементов. Алгоритмы сортировки STL поддерживает несколько алгоритмов, предназначенных для сортировки элементов в интервалах. Кроме полной сортировки существует несколько разновидностей частичной сортировки. Если их результат вас устроит, лучше использовать эти алгоритмы, потому что обычно они работают более эффективно. Ассопиативные контейнеры сортируют свои элементы автоматически. Однако обычно эффективнее однажды выполнить сортировку элементов, а ие хранить их в упорядоченном виде постоянно (см. с. 232). Сортировка всех элементов void sort (RandomAccessIterator beg. RandomAccessIterator end) void sort (RandomAccessIterator beg. RandomAccessIterator end. BinaryPredicate op) void stable sort (RandomAccessIterator beg, RandomAccessIterator end) void stable sort (RandomAccessIterator beg, RandomAccessIterator end. BinaryPredicate op) о Первые формы sort() и stable sort() сортируют все элементы интервала [beg,end) оператором <. О Вторые формы sort() и stable sort() сортируют все элементы интервала, используя в качестве критерия сортировки бинарный предикат op(elemi,elem2). О Предикат ор не должен изменять свое состояние во время вызова. За подробностями обращайтесь на с. 303. О Отличие sort() от stable sort() заключается в том, что stable sort() сохраняет относительный порядок следования равных элементов. О Алгоритмы не могут использоваться со списками, потому что списки не поддерживают итераторы произвольного доступа. Впрочем, для сортировки элементов в списках определена специальная функция sort() (см. с. 252). О Алгоритм sort() гарантирует хорошее среднее быстродействие (nxlog(n)). Тем не менее если в вашей ситуации особенно важно избежать худших случаев, используйте алгоритм partial sort() или stable sort(). Сравнительный анализ алгоритмов сортировки приводится на с. 328. О Сложность; □ Sort() - в среднем nxlog(n) (примерно numberOfElementsx\og{numberOf-Elements) сравнений); □ Stable sort() - nxlog(n) при наличии дополнительной памяти (питЬег-OfElementsx\og(nu7nberOfElements)), «xlog(n)xlog(n) в противном случае (numberOfElements:<\Qg(numberOfElementsy сравнений). Пример использования алгоритма sort(): algo/sortl.cpp finclude "algostuff,hpp" using namespace std; int mainO ( deque<int> coll; INSERT ELEMENTS(coll.l.9); INSERT ELEMENTS(coll.l.9); PRINT ELEMENTS(coll."on entry; "): Сортировка эленентов sort (coll.beginO. coll.endO): PRINTJLEMENTS(C011 . "sorted: "); Сортировка в обратной порядке sort (coll.beginO, coll.endO. Интервал greater<1nt>()): Критерий сортировки PRINT ELEMENTS(C0ll."sorted >; "); 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 [ 123 ] 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |