Недавно перешел на C++. Помогите пожалуста с написанием алгоритма сортировки строк в лексикографическом порядке.
№ | Пользователь | Рейтинг |
---|---|---|
1 | ecnerwala | 3649 |
2 | Benq | 3581 |
3 | orzdevinwang | 3570 |
4 | Geothermal | 3569 |
4 | cnnfls_csy | 3569 |
6 | tourist | 3565 |
7 | maroonrk | 3531 |
8 | Radewoosh | 3521 |
9 | Um_nik | 3482 |
10 | jiangly | 3468 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | maomao90 | 174 |
2 | awoo | 164 |
3 | adamant | 161 |
4 | TheScrasse | 159 |
5 | nor | 158 |
6 | maroonrk | 156 |
7 | -is-this-fft- | 152 |
8 | SecondThread | 147 |
9 | orz | 146 |
10 | pajenegod | 145 |
Название |
---|
Используя библиотеку, которая по названию совпадает с вашим именем (#include <algorithm>):
sort(a+x,a+y,cmp);
Где а - массив строк. Сортируем от x до y-1. Функция cmp задаёт функцию сортировки строк.
либо sort(a+x,a+y); если известно что используется оператор по умолчанию "<"
<это меня уже кроет>
Что, серьезно, существует реализация qsort за n log n?
Не понимаю, почему не применим к stl?
если вы о том что он с итераторами не работает это так, но в vector элементы лежат в памяти последовательно, и вы можете вызвать скажем вот так qsort(&v[0], (&v[0]) + v.size(), cmp);
Еще важный момент который я знаю по олимпиадам,
но использовал и на работе это то что sort и qsort использует
больше вызовов оператора сравнения, чем stable_sort.
Если мы сортируем суффиксы строки оператором сравнения
рабатающим за O( Log N ) то stable_sort гораздо эффективнее.
сортировка слиянием вроде бы ещё меньше раз использует оператор,
надо протестить. это важно если объекты небольшие (можно сортить указатели),
а сравнение тормозное.
Если я ничего не путаю, sort для каждой проверяемой пары запускает функцию сравнения дважды (по крайней мере если она указана отдельно), это можно пронаблюдать запустив дебуг. Вначале запускается cmp(a,b) потом cmp(b,a).
Вероятно это сделано, чтобы проверять корректна ли заданная функция (то есть обязательно должно быть cmp(a,b)!=cmp(b,a))
UPD. небольшая ошибка: ...обязательно должно быть (cmp(a,b) && cmp(b,a))==0
а так sort точно как то иногда отлавливает кривой компаратор - однажды сокомандник час подряд получал RE на тупой задача - оказалось из-за кривого компаратора , который sort отловил.
Да.. что-то я точно недопонимаю, как он отлавливает случай равенства элементов... тем не менее если написать например return a!=b; то прога выдаст ошибку, что компаратор по-разному реагирует на одни и те же данные (если продебужить, заметно, что именно после вызова cmp(a,b) и cmp(b,a))...
cmp подразумевает "<".
если вдруг одновременно a<b и b<a, то упорядочить эти два элемента невозможно и sort будет ругаться (для компаратора a!=b как раз такая фигня происходит).
а если a=b, то оба выражения a<b и b<a не верны - и sort на них не ругается.