Jak posortować liczby będące stringami, o tej samej długości

0

Witam, uczę się algorytmów i mam mały problem z sortowania

Mam 10 liczb zapisanych stringami, np:

123, 1334, 54535354, 543454, 412421421, 122, 41242141214242141224155125215, 5214, 523532532532532532, 532532

Na początku sortuję je bąbelkowo wg. długości stringa i to jest ok.

Ale potem muszę ponownie sortować, no bo przecież mogę mieć kilka liczb tej samej długości.
Używam metody at() aby sprawdzać znaki na kolejnych indeksach stringów, ale moja funkcja nie działa.

Poniżej jej kod:

void drugie_sortowanie(string* tab, int n) {
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < n - 1; j++) {
			if (tab[j].length() == tab[j + 1].length())
			{
				int a = 0;
				if (tab[j].at(a) > tab[j + 1].at(a) && (j+1) < n)
					swap(tab[j], tab[j + 1]);
				else {
					a = 1;
					int x = -1;
					while (x != 1) {
						if (tab[j].at(a) > tab[j + 1].at(a)) {
							swap(tab[j], tab[j + 1]);
							x = 1;
						}
						else if (tab[j].at(a) == tab[j + 1].at(a)) {
							a++;
						}
					}
				}
			}
		}
	}
}

Czasem odpali ale przesortuje tylko dla liczb obok siebie: np: 1243, 1241, 12441412124, dla takiego wariantu: 1412, 124214421412, 1411 już nie

Potrafi ktoś wskazać błąd?
Czy może w ogole źle podchodzę do tego?

0
if (tab[j].length() == tab[j + 1].length())

Ten warunek odrzuca wszystkie pary ciągów o różnej długości, więc do zamiany miejscami nigdy nie dochodzi (dłuższy ciąg nie jest przesuwany w stronę końca kolekcji). Lista kroków powinna wyjaśnić ten przypadek:

  • jeśli ciągi różnią się długością:
    • jeśli bieżący jest dłuższy od następnego:
      • zamień je miejscami
  • w przeciwnym razie, gdy ciągi mają tę samą długość:
    • jeśli wartość bieżącego jest większa niż następnego:
      • zamień je miejscami

Zamiast ręcznie sprawdzać wartości znaków w dwóch ciągach, możesz oba ciągi (bieżący i następny) przekonwertować na liczby i w prosty sposób je porównać. Ale nie wiem czy możesz tak zrobić – nie znam wymagań.

Przy czym jeśli chcesz porównywać w ciągach znaki (bez konwersji) to najpierw sprawdź działanie samej pętli porównującej znaki w parze ciągów. Jeśli ta będzie działać prawidłowo, to wystarczy ją obudować w pętle iterujące po kolekcji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1