Sortowanie bazy danych (vector struktur)

0

Witam. Program ma wczytać dane z pliku (w załączniku). Następnie ma posortować bazę danych, którą jest wektor struktur sortowaniem przez wstawianie. I tu pojawia się problem.
Kiedy testowałem sortowanie działał poprawnie tylko do 3 osób, kiedy zwiększyłem do 5 już nie - zauważyłem że algorytm sortowania wykonuje chyba za mało przebiegów; algorytm jest na bazie artykułu [http://edu.i-lo.tarnow.pl/inf/alg/003_sort/0013.php] dlatego nie wiem co jest grane???

Jeszcze druga sprawa - dla każdego pola struktury mam inną funkcję na sortowanie, a jak zrobić żeby zawrzeć to w jednej funkcji tylko do której przekazywałbym parametr co sortuję??

Dzięki za pomoc; jeśli macie jeszcze jakieś inne uwagi co do programu to piszcie

unsigned short int ilosc = 5;

struct osoba
{
    string imie;
    string nazwisko;
    string numer;
};

vector<osoba> ksiazka(ilosc);

void SortujKsiazke()
{
    do
    {
        system("CLS");
        cout << "\n\tSortowanie ksiazki\n\n\n";
        cout << " 1. Sortuj wedlug imienia\n";
        cout << " 2. Sortuj wedlug nazwiska\n";
        cout << " 3. Sortuj wedlug numeru telefonu\n\n";
        cout << " 4. Powrot do menu >>> ";
        ch = getch();
        if (ch == '1' || '2' || '3')
        {
            switch (ch)
            {
            case '1':
                SortowaniePoImieniu();
                break;
            case '2':
                SortowaniePoNazwisku();
                break;
            case '3':
                SortowaniePoNumerze();
                break;
            }
        }
    } while (ch != '4' && ch != 27);
    ch = ' ';
}

void SortowaniePoImieniu()//Insertion Sort
{
    osoba tmp;
    for(int j = ilosc - 2; j >= 0; j--)
    {
        tmp = ksiazka[j];
        i = j + 1;
        while((i < ilosc) && (ksiazka[j].imie > ksiazka[i].imie))
        {
            ksiazka[i - 1] = ksiazka[i];
            i++;
        }
        ksiazka[i - 1] = tmp;
    }
    cout << "\n\n Sortowanie zakonczone pomyslnie";
    timer(2);
}

void SortowaniePoNazwisku()//Insertion Sort
{
    osoba tmp;
    for(int j = ilosc - 2; j >= 0; j--)
    {
        tmp = ksiazka[j];
        i = j + 1;
        while((i < ilosc) && (ksiazka[j].nazwisko > ksiazka[i].nazwisko))
        {
            ksiazka[i - 1] = ksiazka[i];
            i++;
        }
        ksiazka[i - 1] = tmp;
    }
    cout << "\n\n Sortowanie zakonczone pomyslnie";
    timer(2);
}

void SortowaniePoNumerze()//Insertion Sort
{
    osoba tmp;
    for(int j = ilosc - 2; j >= 0; j--)
    {
        tmp = ksiazka[j];
        i = j + 1;
        while((i < ilosc) && (ksiazka[j].numer > ksiazka[i].numer))
        {
            ksiazka[i - 1] = ksiazka[i];
            i++;
        }
        ksiazka[i - 1] = tmp;
    }
    cout << "\n\n Sortowanie zakonczone pomyslnie";
    timer(2);
}

void WczytajKsiazke()
{
    do
    {
        char sciezka[100] = "C:\\kstel.txt";
        system("CLS");
        cout << "\n\tWczytaj ksiazke telefoniczna z pliku\n\n\n";
        cout << " 1. Uzyj domyslnej sciezki 'C:\\kstel.txt'\n";//znak \\ daje \, nie mozna zastosowac jednego backslasha!
        cout << " 2. Podaj wlasna sciezke odczytu\n\n";
        cout << " 3. Powrot do opcji programu >>> ";
        ch = getch();
        switch (ch)
        {
        case '1':
            Wczytywanie(sciezka);
            break;
        case '2':
            //cin.get();//wyczyszczenie bufora
            cout << "\n\n\n Podaj sciezke (dodaj rozszerzenie): ";
            cin.getline(sciezka,100);//sciezka pliku ograniczona do 99 znakow
            Wczytywanie(sciezka);
            break;
        }
    } while (ch != '3' && ch != 27);
    ch = ' ';
}

void Wczytywanie(char sciezka[])
{
    string bin;
    ifstream fin;//tworzymy obiekt fin ("filein") podobny do obiektu cin ("consolein")
    fin.open(sciezka);//skojarzenie obiektu zplikiem
    if (fin.is_open())
    {
        for (pv = ksiazka.begin(); pv != ksiazka.end(); pv++)
        {
            getline(fin, bin);
            getline(fin, pv->imie);
            getline(fin, pv->nazwisko);
            getline(fin, pv->numer);
            getline(fin, bin);
        }
    }
    if (!fin.fail())
        cout << "\n\n\n Wczytywanie zakonczone pomyslnie\n\n\n ";
    else
        cout << "\n\n\n Blad odczytu\n\n ";
    fin.close();
    system("PAUSE");
}
0

ksiazka[j].imie > ksiazka[i].imie
yy czyli 1 > 1 ?

0

Nie chce mi się analizować tego sortowania, ale w przypadku sortowania możesz to zawrzeć w jednej funkcji, przekazując do niej dodatkowo funkcję porównującą. Wtedy różne sortowania będą się różniły tylko tą funkcją.

0
ququs napisał(a):

ksiazka[j].imie > ksiazka[i].imie
yy czyli 1 > 1 ?

nie bardzo rozumiem, w pierwszym obiegu dla 'ilosc == 5': 'j' jest równe przedostatniemu indeksowi a 'i' ostatniemu - wyżej jest przecież instrukcja 'i = j + 1;' ???

Może ktoś chce się podzielić jeszcze przemyśleniami?

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