Как отсортировать дробную и целую часть числа в C++?
Помогите пожалуйста. Необходимо решить задачу на С++, дан поток входных данных, представленных в виде рациональных чисел, нужно отсортировать эти числа в порядке неубывания целой части, и в порядке убывания дробной. т.е при входных данных : 2,3; 2; 2,4; 5,2; 5,1; 7,9; 6; . Oтвет должен быть 2,4; 2,3; 2; 5,2; 5,1; 6; 7,9;
Целую часть можно получить с помощью floor(v)
Дробную: (v - floor(v))
Для сортировки используйте стандартный sort.
Кстати, отсортировать вы можете массив (он у вас уже есть в памяти), когда говорят про поток, то это нечто потенциально бесконечное, порции данных из потока вы получаете частями и обрабатываете их.
Соответственно, если у вас действительно поток, то надо строить из его данных дерево. Для этого можно использовать стандартный map. Данные будут укладываться в дерево по мере поступления с одновременной сортировкой. Получить из дерева отсортированный список можно просто обходом дерева с помощью итератора.
Данные в дереве сортируются по ключу. Для ключа можно использовать примерно такую конструкцию: floor(v) + (1 - (v - floor(v)))
А как совместить дробную с целой, что бы было правильно отсортировано, допустим если введётся 3 пятёрки в разный момент и одна из них будет целым числом?
Используй std::modf[?] чтобы разбить число на составные части. Каждая составная часть для тебя будет буквой слова при сравнении.
Дальше ты можешь вести сравнение между буквами одного порядка так, как это делается при лексикографическом сравнении.
Например, посмотри как я форматы сортирую по их свойствам. Порядок сортировки там тоже является лексикографическим.
А как совместить дробную с целой, что бы было правильно отсортировано, допустим если введётся 3 пятёрки в разный момент и одна из них будет целым числом?
Да не надо ничего совмещать.
В std::qsort, ты, кроме массива, должен передать еще и функцию сравнения. Функцию сравнения пишешь сам и там реализовываешь все нюансы сравнения: выделяешь целую часть, целые части сравниваешь "по возрастанию", если целые равны, то сравниваешь дробные "по убыванию" и возвращаешь правильное значение.
В std есть и другие сортировки, там принцип такой же.
Нужно писать свой алгоритм сортировки или можно юзать алгоритмы из std? В целом алгоритм такой пишите функцию сравнения и передаете ее в функцию сортировки, получаете результат.