• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Quicksort (jak) sortowanie struktur

0 głosów
1,304 wizyt
pytanie zadane 7 kwietnia 2016 w C i C++ przez Jędrzej Dembowski Użytkownik (740 p.)

Witam, napisałem taką oto funkcję, która ma za zadanie posortować pracowników w spisie po nazwiskach, a potem po imionach

void  sortuj_spis(void)
{
	int i, j;
	char tempi[IMIE_MAX+1]; //imie
	char tempn[NAZW_MAX+1]; //naz
	int tempp;              //pensja
	for(i=0; i<IL_OSOB-1; i++)
	{
		for(j=i+1; j<IL_OSOB; j++)
        {
            if (strcmp(spis[i].nazwisko, spis[j].nazwisko) > 0)
            {
                strcpy(tempn, spis[i].nazwisko);
				strcpy(tempi, spis[i].imie);
				tempp = spis[i].pensja;
                strcpy(spis[i].nazwisko, spis[j].nazwisko);
				strcpy(spis[i].imie, spis[j].imie);
				spis[i].pensja = spis[j].pensja;
				strcpy(spis[j].nazwisko, tempn);
				strcpy(spis[j].imie, tempi);
				spis[j].pensja=tempp;
			}

			if (strcmp(spis[i].nazwisko, spis[j].nazwisko) == 0)
			{
				if (strcmp(spis[i].imie, spis[j].imie) > 0)
            		{
					strcpy(tempi, spis[i].imie);
					tempp = spis[i].pensja;
					strcpy(spis[i].imie, spis[j].imie);
					spis[i].pensja = spis[j].pensja;
					strcpy(spis[j].imie, tempi);
					spis[j].pensja=tempp;
            		}
			}

       	}

    }

}

Muszę ją udoskonalić tak, aby wykorzystywała funkcję quicksort z własną definicją (chyba qrst(spis,IL.OSOB,sizeof(osoba),strcmp) i potem osoba.cmp(const void *a, const void *b) tylko wtedy wystarczy posortować aby po nazwiskach, moje pytanie brzmi jak to wszystko skleić aby się skompilowało. Za wszystkie odpowiedzi będę bardzo wdzięczny. 

2 odpowiedzi

0 głosów
odpowiedź 7 kwietnia 2016 przez Jędrzej Dembowski Użytkownik (740 p.)
edycja 7 kwietnia 2016 przez Jędrzej Dembowski

Napisałem 

int my_compare (const void * a, const void * b)
{
    char const *aa = (char const *)a;
    char const *bb = (char const *)b;

    return strcmp(aa, bb);
}
//=======================================================
void  sortuj_spis(void)
{
	qsort(spis, IL_OSOB, sizeof(osoba), my_compare);
	FILE* baza2=fopen("posortowane.txt","w");
	int i;
    for(i=0;i<IL_OSOB;i++)
    {
       fprintf(baza2, "%20s	", spis[i].imie);
       fprintf(baza2, "%20s	", spis[i].nazwisko);
       fprintf(baza2, "%20i\n", spis[i].pensja);
    }
    fclose(baza2);
}

Okej napisałem, fajnie posortowało, tylko że po imionach... Da się to zamienić żeby sortowało po nazwiskach?

komentarz 7 kwietnia 2016 przez draghan VIP (106,230 p.)

Po sygnaturach funkcji zgaduję, że to jest C. A rzutowanie w C wyglądałoby tak:

int my_compare (const void * a, const void * b)
{
    //rzutowania na typ osoba:
    osoba *osoba_a, *osoba_b;
    osoba_a = (osoba*)a;
    osoba_b = (osoba*)b;

    // błędne porównania:
    if(osoba_a->nazwisko  <  osoba_b->nazwisko) return -1;
    else if(osoba_a->nazwisko  ==  osoba_b->nazwisko) return 0;
    else return 1;
}

Dlaczego napisałem "błędne porównania"? W tej chwili sprawdzasz, który wskaźnik jest bliżej adresu zerowego w pamięci. Do porównania leksykograficznego służy funkcja strcmp().

komentarz 7 kwietnia 2016 przez draghan VIP (106,230 p.)
Och, edytowałeś. Twoja funkcja porównująca jest bardzo ogólna i w tym wypadku wszystko zależy od wywołania.
komentarz 7 kwietnia 2016 przez Jędrzej Dembowski Użytkownik (740 p.)
Jeżeli w spisie nazwiska będą umieszczone przed imionami to posortuje względem nazwisk... Zakładam, że o to chodziło wykładowcy tylko się pomylił i  myślał, że nazwiska wpisujemy pierwsze. Dlatego też pewnie potem powiedział, że nie będziemy mogli szukać binarnie po imionach, bo nazwiska są posortowane tą funkcją.
komentarz 7 kwietnia 2016 przez Jędrzej Dembowski Użytkownik (740 p.)
Chyba, że da się coś zmienić, aby funkcja compare porównywała nazwiska?
komentarz 7 kwietnia 2016 przez draghan VIP (106,230 p.)
Spójrz na przykład rozwiązania, które Ci podałem.
–1 głos
odpowiedź 7 kwietnia 2016 przez ZakosiliMiNeta Nałogowiec (30,870 p.)
Void i w parametrach Void ma to wogóle prawo działać? "quicksort z własną definicją " czyli masz naklepać Quicksorta od 0 czy tylko funkcje porównującą. Bo jeśli tak to stosujesz sort z algorithma i klepiesz swą funkcje
komentarz 7 kwietnia 2016 przez niezalogowany
Tak, wskaźniki na voida mają prawo działać i jest to zapis w pełni legalny
komentarz 7 kwietnia 2016 przez Jędrzej Dembowski Użytkownik (740 p.)
tylko moją funkcję porównującą, w osoba.cmp trzeba zrzutować zmienne a i b na osobe, nie wiem jak to wgl napisać i połączyć w całość

Podobne pytania

0 głosów
2 odpowiedzi 1,247 wizyt
pytanie zadane 24 czerwca 2018 w C i C++ przez siemasiema123.96 Początkujący (350 p.)
0 głosów
0 odpowiedzi 800 wizyt
pytanie zadane 21 czerwca 2018 w C i C++ przez siemasiema123.96 Początkujący (350 p.)
0 głosów
1 odpowiedź 2,203 wizyt
pytanie zadane 9 czerwca 2018 w C i C++ przez WhizzKid Początkujący (400 p.)

93,765 zapytań

142,721 odpowiedzi

323,373 komentarzy

63,359 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...