Problem z sortowaniem ciągów

0

Problem przedstawia się następująco: mam ciągi składające się z n liczb kazdy.
Ciagi te zapisane są w dwuwymiarowej tablicy, każdy wiersz tablicy to jeden ciąg, a ciągów tych w tablicy jest p (tablica jes dynamiczna), czyli:

int *tab[p*n];

Niech przykładowo zawartość tablicy wygląda w ten sposób:

 
tab={3,4,5,
     4,5,3,
     4,3,5,
     3,5,4,
     5,4,3,
     5,3,4};

Jak posortować te ciągi, aby były ustawione rosnąco? Rosnąco czyli tak żeby tablica wyglądała tak:

 
tab={3,4,5,
     3,5,4, 
     4,3,5, .......

itd. Domyślam się, że należy zastosować sortowanie pozycyjne, a w nim zliczanie, czy coś podobnego. Mam tylko problem implementacją.

0

Jeśli masz taką możliwość to zrób to na vectorach - to znacznie ułatwi sparwę bo funkcję sortującą masz już gotową:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool mniejszy(vector<long> first, vector<long> second) {
    if(first[0] < second[0])
        return true;

    return false;
}

int main() {

vector<vector<long> > dupa(5);

for(int i=0; i < 5; ++i) {
    for(int j =0; j < 5; ++j)
        dupa[i].push_back((j-i) % 3);
}

for(int i=0; i < 5; ++i) {
    for(int j=0; j < 5; ++j)
        cout << dupa[i][j] << "\t";

    cout << endl;
}

cout << endl << endl;

sort(dupa.begin(), dupa.end(), mniejszy);

for(int i=0; i < 5; ++i) {
    for(int j=0; j < 5; ++j)
        cout << dupa[i][j] << "\t";

    cout << endl;
} 



system("pause");
return 0; 
}

Możesz sobie to przerobic wg. uznania... Myślę, że to będzie najlepszy sposób :)

0

Zrobilem z tego cos takiego:

#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
bool mniejszy(vector<long> first, vector<long> second) {
    if(first[0] < second[0])
        return true;
    return false;
}
int main(){
	int silnia[8]={6,24,120,720,5040,10000,10000,10000},p,i,k,s,*t;
	scanf("%d",&p); 
	s=silnia[p-3];
	vector<vector<long> > vc(s);
	t=new int[p];
	for(i=0; i<p; ++i) scanf("%d",&t[i]); printf("\n");
	for(i=0; i<s; ++i){
		for(k=0; k<p; ++k) vc[i].push_back(t[k]); 
		int temp=t[i%(p-1)]; 
		t[i%(p-1)]=t[i%(p-1)+1]; 
		t[i%(p-1)+1]=temp;
	}
	sort(vc.begin(), vc.end(), mniejszy);
	for(i=0; i<s; ++i){
		for(int k=0; k<p; ++k){ printf("%d",vc[i][k]); printf("%c",k<p-1?'.':'\n');}
	}
	return 0;
}

i mam chyba nie o to chodzilo. Ciagi mają pozostac nie zmienione, tylko ich kolejnosc w tablicy ma ulec zmianie. Tymczasem gdy tutaj podam dane wejsciowe
3(liczba wyrazow w kazdym ciagu) i 1,2,3 (liczby z ktorych tworzone są ciągi), utworzone zostają wszystki możliwe ciągi z tych liczb i sortuje czesc dobrze czesc zle. Sortuje wiekszosc dobrze wedlug pierwszej liczby ciagu, wedlug pozostalych liczb juz nie zawsze.

0

Pisałem to dla kumpla i jemu było potrzebane właśnie sortowanie wg. pierwszego znaku.

Wystarczy zmienić funkcję porównującą:

bool mniejszy(vector<long> first, vector<long> second) {
    if(first[0] < second[0])
        return true;
    return false;
}

Możesz zrobić to w pętli z warunkami: jeśli są równe to kolejny obrót i porównanie kolejnych elementów, jeśli pierwszy jest mniejszy to zwróć prawde, a jeśli drugi to fałsz.

0

No i tym sposobem implementacja staje sie niewiele łatwiejsza niz na zwylych tablicach. W zasadzie niewiele mi daje samo napisanie sposobu. Chodzi o konkretny przyklad. Potrzebna jest petla albo rekurencja. W kazdym razie dla kolejnych serii ciągów o takim samym n-tym argumencie trzeba je sortować i tak dla wszystkich a to trochę zajmuje. Chodzi o jak najłatwiejszą i jak najszybszą wersję.

0

Hmm, zapomaniałem o jednej ważnej rzeczy: vectory mają przeładowane operatory <, >, itd... wobec tego nie trzeba przekazywać do sortowanie żadnej funkcji :P

Wywołaj ją w ten sposób:

sort(vc.begin(), vc.end());

No i tym sposobem implementacja staje sie niewiele łatwiejsza niz na zwylych tablicach. W zasadzie niewiele mi daje samo napisanie sposobu. ... Potrzebna jest petla albo rekurencja. W kazdym razie dla kolejnych serii ciągów o takim samym n-tym argumencie trzeba je sortować i tak dla wszystkich a to trochę zajmuje.

No nie wiem... :| Zaimplelemntuj sobie własnego introsorta, to zobaczysz czy nie lepiej korzystać z funkcji bibliotecznych, a nie "wyważać otwartych drzwi"... Poza tym jaka rekurencja ?? Iteracyjnie można to szybciej zrobić, zresztą i tak już nie potrzeba, bo rozwiązanie jest na gorze postu :P

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