LINUX.ORG.RU

сортировка си.

 


0

1

есть задача, допустим есть файл с телефонами, допустим что-то типа такого:

81112222222, 82223333333, 83334444444

надо отсортировать не по первой цифре, а вообще по всем.

в голову пришло такое:

сделать из каждого номера int. чем нибудь типа atoi и сортировать не по символу, а по int,

вопрос, вероятно надо создать структуру, что-то типа

struct {
    int hash;
    char[10] num;
}

затем создать массив из таких структур, затем создать массив указателей на каждую структуру и уже сортировать указатели.

вроде работать будет. а как такое реализуется по взрослому? то есть есть ли какие-то универсальные алгоритмы или что-то подобное?

★★★

Последнее исправление: IvanR (всего исправлений: 2)

то есть есть ли какие-то универсальные алгоритмы или что-то подобное

Есть. Называется strcmp ;)

Macil ★★★★★
()

Вместо портянки на С можно обойтись парой строчек на более подходящем языке, например:

$, = ', ';
print sort split /, /, <>;

В любом случае, узкое место в таком подходе (вне зависимости от языка) — требование к памяти: все данные должны туда поместиться. Если это требование выполнить невозможно, значит надо хранить данные по-другому.

P.S. Посмотри еще сортировку слиянием.

Relan ★★★★★
()
Последнее исправление: Relan (всего исправлений: 1)
Ответ на: комментарий от IvanR

Вот и выросло поколение, которое...

Домашнее задание: реализовать strcmp() самостоятельно, не подглядывая в книжечки и гугль. А то так и будешь всю жизнь на ЛОРе спрашивать, как сделать то и как сделать сё.

anonymous
()
Ответ на: комментарий от IvanR

Но вообще ты придумал достаточно известный и полезный подход (забыл как называется). При сортировке функция сравнения вызовется в среднем n*log(n) раз, и если она сама достаточно затратная, то имеет смысл сначала рядом с элементами «построить индекс», отсортировать по нему, а потом выкинуть.

arturpub ★★
()

Можно ещё рекурсию прикрутить. Только зачем?

Raptor
()

Простой способ

Если все числа начинаются с цифры и не нуля, то можно, как написано, конвертировать строки в числа, их сортировать, а потом обратно сконвертировать числа в строки

urquan
()

Зачем это всё? Вон, гляди какая красота:

    std::vector<std::string> numbers = { "81112222222", "82223333333", "83334444444" };
    std::sort (numbers.begin(), numbers.end());
    for(std::string& s : numbers) std::cout << s << std::endl;
anonymous
()
Ответ на: комментарий от Relan

С каких пор недоперл стал подходящим?

UVV ★★★★★
()
Ответ на: комментарий от anonymous

красота

вот так симпатичнее:

list<string> numbers { "81112222222", "82223333333", "83334444444" };
numbers.sort();

for( string& s : numbers )
    cout << s << endl;
wota ★★
()
Ответ на: комментарий от Gvidon

Заменить std::string в цикле на auto

сойдёмся на том, что о вкусах не спорят

anonymous
()
Ответ на: комментарий от anonymous

Нет, это отвратительно. Сойдёмся на том, что о вкусах не спорят.

нет, не сойдемся, «std::» - явно бесполезный мусор в коде, да и мешать в кучу код, не разделяя его пустыми строками, тоже однозначно плохо

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)

Если интересно отсортировать руками то посмотри radix sort. Вкратце: сортируем сначала по последнему символу, потом по предпоследнему итп. Сортировка ведётся путём раскидывания номеров по 10 «корзинам», номер корзины совпадает с цифрой.

true_admin ★★★★★
()
Ответ на: комментарий от anonymous

это отвратительно
std:: я бы убрал
Ферштейн?

нихт, ну да ладно

П.С. для ТС - если сначала сконвертировать в числа, то для телефонных номеров почти наверняка будет быстрее («стоимость» конвертации в числа компенсируется на сравнении строк), кроме того - если у номеров разное кол-во цифр, то с числами не надо будет это отдельно учитывать, а в остальном - задача сводится к стандартному qsort + функция в одну строку

wota ★★
()
Ответ на: комментарий от anonymous

Так ещё всякие бусты же, помимо std. И у всех свои vector, sort. Лучше явно указывать, когда могут быть разночтения. Особенно когда нет инклюдов и не ясно, откуда это всё взялось.

anonymous
()
Ответ на: комментарий от anonymous

СЛышал, что, наоборот, std:: хороший тон.

для компилятора, разве что, регулярно читать такое:

std::chrono::time_point<std::chrono::system_clock> start;

это каторга

wota ★★
()
Ответ на: комментарий от wota

Где тут каторга-то? Глаза лечи. И от СДВГ таблеточек попей.

anonymous
()
Ответ на: комментарий от wota

И да, как же ты книжки читаешь? Там же вообще жуть сколько буковок и слов разных. Или тоже, больше одного предложения в голове не удержать?

anonymous
()
Ответ на: комментарий от anonymous

Так ещё всякие бусты же, помимо std. И у всех свои vector, sort.

нормальные библиотеки не используют стандартные имена, назвали бы они свой класс boost_vector и читалось бы не хуже чем boost::vector, и конфликтов по именам бы не было

wota ★★
()
Ответ на: комментарий от wota

Ну позвони Страуструпу, скажи ему, что он мудак и неймспейсы не нужны, надо просто префиксы добавлять к именам, и тогда наступит счастье.

anonymous
()
Ответ на: комментарий от anonymous

И от СДВГ таблеточек попей.

не знаю, что такое СДВГ, рассказывать не надо, это видно что-то твое личное

И да, как же ты книжки читаешь? Там же вообще жуть сколько буковок и слов разных. Или тоже, больше одного предложения в голове не удержать?

книги они разные бывают, в одних «воды» нальют, в других больше нужного и интересного напишут, но ты, очевидно, не видишь этой разницы

wota ★★
()
Ответ на: комментарий от anonymous

Ну позвони Страуструпу, скажи ему, что он мудак и неймспейсы не нужны

а они нужны, просто не надо стандартные имена использовать

wota ★★
()
Ответ на: комментарий от wota

Почему это, когда это в том числе их фича? Знания С++ у тебя весьма весьма поверхностные.

Ну а для товарищей с СДВ (я всё-таки скажу, что это синдром дефицита внимания) и проблема с удержанием кода в голове специально сделали

template<typename T>  using boost_vector = boost::vector<T>;

anonymous
()
Ответ на: комментарий от wota

книги они разные бывают, в одних «воды» нальют, в других больше нужного и интересного напишут, но ты, очевидно, не видишь этой разницы

Тебе-то откуда знать, ты же всё равно текст в голове не держишь, если тебя даже чтение кода с std:: мучения приносит.

anonymous
()
Ответ на: комментарий от anonymous

Почему это, когда это в том числе их фича?

http://livebookmark.net/journal/wp-content/uploads/2009/09/imagesbug_20vs_20f...

Знания С++ у тебя весьма весьма поверхностные

их вообще нет

специально сделали

спасибо Страуструпу

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от anonymous

Тебе-то откуда знать, ты же всё равно текст в голове не держишь

и то правда, и, кстати, ты вообще кто и что хочешь?

wota ★★
()
Ответ на: комментарий от wota

Почему это, когда это в том числе их фича?

[картинка]

Знания С++ у тебя весьма весьма поверхностные

их вообще нет

Но авторитетно вещать на тему С++ любишь. О чём ещё нет у тебя знаний? Давай о балете поговорим, например. Вот я про него ничего не знаю, но 100% уверен, что лучшая пружина для балетных тапочек делается из титана (в металлах я тоже не особо).

anonymous
()
Ответ на: комментарий от wota

и то правда, и, кстати, ты вообще кто и что хочешь?

Как-то ты быстро скатился до «а ты кто такой?!».

Я анонимус, мне нужно одно: чтобы люди, не разбирающиеся в С++ его перестали трогать. Ну это в идеале.

anonymous
()
Ответ на: комментарий от anonymous

О чём ещё нет у тебя знаний?

ну, например, я не умею переводить тему с ЯП и конкретных примеров кода на личности, а вот ты явно про это много знаешь

wota ★★
()
Ответ на: комментарий от anonymous

Как-то ты быстро скатился до «а ты кто такой?!».

это был сарказм по поводу «текст в голове не держишь»

wota ★★
()
Ответ на: комментарий от anonymous

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

П.С. разговор не конструктивен, потому больше в нем не участвую

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от wota

Какие личности-то. У тебя проблемы с восприятием кода на С++, в котором полностью указаны нейспейсы. Сам сказал, что каторга. Но сделал не верный вывод, что это не у тебя проблемы с восприятием такого кода, а это С++ плохой.

anonymous
()
Ответ на: комментарий от arturpub

«построить индекс», отсортировать по нему, а потом выкинуть.

примерно так я и написал в первом посте :)

только я вообще-то забыл о том, что можно строки тоже сравнивать :)

IvanR ★★★
() автор топика
Ответ на: комментарий от anonymous

Тс вот явно не разбирается в С++, и вопрос у него не о нем, но ты зачем-то предложил ему потрогать. Хотя не хочешь, чтобы трогали. Парадокс какой-то получается.

arturpub ★★
()
Ответ на: комментарий от anon1984

да - тут надо константную ссылку, каюсь, пропустил при копипасте, const вообще нужнейшая вещь, как и новый (в С++) override

wota ★★
()
Ответ на: комментарий от nokachi

Получается для сортировки беспорядочного массива из 2^32 элементов мы выполним _итого_ log2(2^32) == 32 сравнения, что очевидно неверно. Если ты про вызовы относительно к-л одного элемента, то да, количество вызовов именно с ним будет от 1 до 32 раз, об этом и шла речь выше.

arturpub ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.