Comme d'autres l'ont souligné, un tri lexicographique et la concaténation est proche, mais pas tout à fait correcte. Par exemple, pour le nombre 5
, 54
, et 56
un tri lexicographique produira {5, 54, 56} (en ordre croissant) ou {56, 54, 5} (par ordre décroissant), mais ce que nous voulons vraiment est {56, 5, 54}, car qui produit le plus grand nombre possible.
Si nous voulons une comparaison de deux nombres qui met en quelque sorte les plus gros chiffres d'abord.
- Nous pouvons le faire qu'en comparant les chiffres individuels des deux nombres, mais nous devons être prudents lorsque nous parcourons la fin d'un numéro si le numéro d'autres encore a les chiffres restants. Il y a beaucoup de compteurs, de l'arithmétique, et le bord des cas que nous avons pour obtenir le droit.
-
Un mignon solution (également mentionné par @Sarp Centel) permet d'obtenir le même résultat (1), mais avec beaucoup moins de code. L'idée est de comparer la concaténation de deux nombres à l'inverse de la concaténation de ces nombres. Tous les trucs que nous avons à traiter explicitement dans (1) est traitée implicitement.
Par exemple, pour comparer 56
et 5
, nous aimerions le faire régulièrement lexicographique comparaison des 565
de 556
. Depuis 565
> 556
, nous allons dire que c' 56
est plus "large" qu' 5
, et devrait venir en premier. De même, en comparant 54
et 5
signifie que nous allons test 545
< 554
, qui nous dit qu' 5
est plus "large" qu' 54
.
Voici un exemple simple:
// C++0x: compile with g++ -std=c++0x <filename>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
int main() {
std::vector<std::string> v = {
"95", "96", "9", "54", "56", "5", "55", "556", "554", "1", "2", "3"
};
std::sort(v.begin(), v.end(),
[](const std::string &lhs, const std::string &rhs) {
// reverse the order of comparison to sort in descending order,
// otherwise we'll get the "big" numbers at the end of the vector
return rhs+lhs < lhs+rhs;
});
for (size_t i = 0; i < v.size(); ++i) {
std::cout << v[i] << ' ';
}
}
Lorsqu'il est exécuté, ce code affiche:
9 96 95 56 556 5 55 554 54 3 2 1