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

Quicksort (jak) sortowanie struktur

VPS Starter Arubacloud
0 głosów
892 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,910 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 694 wizyt
pytanie zadane 24 czerwca 2018 w C i C++ przez siemasiema123.96 Początkujący (350 p.)
0 głosów
0 odpowiedzi 262 wizyt
pytanie zadane 21 czerwca 2018 w C i C++ przez siemasiema123.96 Początkujący (350 p.)
0 głosów
1 odpowiedź 1,557 wizyt
pytanie zadane 9 czerwca 2018 w C i C++ przez WhizzKid Początkujący (400 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...