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

Sortowanie quicksort - kilka pytań

Object Storage Arubacloud
0 głosów
1,413 wizyt
pytanie zadane 26 lipca 2015 w Algorytmy przez TomaszGasior Obywatel (1,210 p.)

Witam serdecznie. Jestem nowym użytkownikiem forum MZ, dlatego, jeśli to możliwe, proszę o wyrozumiałość. ;) Witajcie.

Od kilku godzin analizuję algorytm quicksort. Większość już rozumiem (tak, wiem, szybki nie jestem...), ale mam kilka wątpliwości.

void quicksort(int *tablica, int lewy, int prawy) { 
	int v=tablica[(lewy+prawy)/2]; 
	int i,j,x; 
	i=lewy; 
	j=prawy; 
	do{ 
		while (tablica[i]<v) i++; 
		while (tablica[j]>v) j--; 
		if (i<=j){ 
			x=tablica[i]; 
			tablica[i]=tablica[j]; 
			tablica[j]=x; 
			i++; 
			j--; 
		} 
	} while (i<=j); 
	if (j>lewy) quicksort(tablica,lewy, j); 
	if (i<prawy) quicksort(tablica, i, prawy); 
}

Kod z prezentacji pana Zelenta.

Moje pytania:
- dlaczego w linii 9. i 16. używamy warunku mniejszy bądź równy zamiast mniejszy?
- dlaczego używamy pętli do..while, a nie while; czemu pętla powinna wykonać się raz przed sprawdzeniem warunku?
- dlaczego w 17. i 18. linijce kodu są warunki; co by było bez nich?

Pozdrawiam, z góry dziękuję za odpowiedź.

1 odpowiedź

+1 głos
odpowiedź 26 lipca 2015 przez nowyfolder Mądrala (7,250 p.)
wybrane 26 lipca 2015 przez TomaszGasior
 
Najlepsza

Moje pytania:
- dlaczego w linii 9. i 16. używamy warunku mniejszy bądź równy zamiast mniejszy?
- dlaczego używamy pętli do..while, a nie while; czemu pętla powinna wykonać się raz przed sprawdzeniem warunku?
- dlaczego w 17. i 18. linijce kodu są warunki; co by było bez nich?

Pozdrawiam, z góry dziękuję za odpowiedź.

 1. Ponieważ indexy i oraz j mają się "minąć", aby potem wywołania w linii 17 i 18 miały sens. Zauważ że i służy jako lewy index prawej tablicy, a j jako prawy index lewej tablicy. W przeciwnym wypadku możliwe jest że i będzie równe j, co jest bezsensowne, gdyż ten element na które wskazywały by te indeksy, to już dobrze wypozycjonowany element. Strata czasu.
2. Wywolując funkcję quicksort parametr lewy jest <= parametrowy prawy, więc można pominąć pierwsze sprawdzenie
3. Bez tych warunków dla tablic jednoelementowych funcja nadal wy się wywoływała (j == lewy ==prawy == i). Stack overflow! :)

komentarz 26 lipca 2015 przez TomaszGasior Obywatel (1,210 p.)
Ok, dzięki za wyjaśnienie.

A nie da się tak przepisać tej funkcji, zeby i oraz j nie musiły się "mijać" tylko żeby, gdy "dobiją" do siebie, od razu zacząć rekurencyjne wywoływanie funkcji quicksort, zmieniając oczywiście też warunki w ostatnich linijkach?

Dzięki twojemu wyjaśnieniu już wszystko rozumiem, ale ciekawi mnie, czy bez "mijania się" p i q, tutaj i i j, da się to zrobić?
komentarz 26 lipca 2015 przez nowyfolder Mądrala (7,250 p.)
Hmm, zapewne się da, nie miałem styczności z tym algorytmem od ponad roku, ale może spróbuję coś naskrobać.
komentarz 26 lipca 2015 przez nowyfolder Mądrala (7,250 p.)

ok, chyba działa, kilkanaście razy testowałem w kazdym razie :P
 

void quicksort(int *tablica, int lewy, int prawy) {
	int v = tablica[(lewy + prawy) / 2];
	int i, j, x;
	i = lewy;
	j = prawy;
	do {
		while (tablica[i]<v) i++;
		while (tablica[j]>v) j--;
		if (i < j) {
			x = tablica[i];
			tablica[i] = tablica[j];
			tablica[j] = x;
			i++;
			j--;
		}
	} while (i < j);

	if (j>lewy) quicksort(tablica, lewy, j==i ? j-1 : j);
	if (i<prawy) quicksort(tablica, j==i ? i+1 : i, prawy);
}

 

Podobne pytania

0 głosów
1 odpowiedź 280 wizyt
pytanie zadane 29 maja 2015 w Algorytmy przez Kororo3 Nowicjusz (150 p.)
0 głosów
0 odpowiedzi 149 wizyt
pytanie zadane 15 listopada 2022 w C i C++ przez ijoasia Nowicjusz (120 p.)
0 głosów
1 odpowiedź 335 wizyt
pytanie zadane 28 marca 2020 w C i C++ przez wall7489 Obywatel (1,250 p.)

92,634 zapytań

141,505 odpowiedzi

319,883 komentarzy

62,015 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...