Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Zdravím,
jak by mohl vypadat třídící algoritmus, ve kterém se nesmí vyskytovat cyklus? Zřejmě to povede na nějakou rekurzi, ale nenapadá mě, jak to dát dohromady.
Offline
↑ byk7:
Ahoj,
a co je tedy povoleno? Volání funkcí? A cykly jsou zakázány i FOR cyklus i WHILE cyklus? Tak si nasimuluj cyklus pomocí rekurze - dej si do parametru rekurzivní funkce aktuální čítač a maximální hodnotu čítače...
Offline
Ahoj ↑ byk7:.
Jak zmínil ↑ check_drummer:, cykly jsou nahraditelné rekurzí. Jinak, quicksort je založený na rekurzi, takže pokud budeš volit pivota nějak triviálně, měl by ses bez cyklů taky obejít.
Offline
Když jsme kdysi Quicksort programovali, dostali jsme něco takového
void quicksort (int a[], int l, int p)
{
int i=l, j=p, pom;
int x=a[(l+p)/2];
do
{
while (a[i]<x) i++;
while (a[j]>x) j--;
if (i<=j)
{
pom=a[i]; a[i]=a[j]; a[j]=pom;
i++; j--;
}
} while (i<=j);
if (l<j) quicksort(a, l, j);
if (i<p) quicksort(a, i, p);
}Mně ale pořád není jasné, jak ty cykly nahradit. V tom těle funkce rekurzivni_cyklus asi musí být ještě nějaké další vychytávky, ne? To je to, co mi trochu dělá problém.
Jinak, ještě dodám kompletní úlohu.
Zadání 04 napsal(a):
Vytvořte program, který do celočíselného pole o sto prvcích vygeneruje náhodná čísla z rozsahu 1 až 1000 (včetně). Tato vygenerovaná čísla vytiskne na obrazovku v pořadí, ve kterém byla generována. Následně vytiskne tato čísla opět na obrazovku, ale utříděná dle velikosti od nejmenšího k největšímu. K třídění použijte libovolný třídící algoritmus.
Poznámka: V tomto programu nesmíte použít cyklus FOR, WHILE ani REPEAT!!!
Offline
Funkční schéma v pythonu najdeš na:
http://uloz.to/xWNdV1xY/sort-bez-cyklu-py
je to bohatě oREMovano, tak třeba si z toho něco vybereš :-)
Offline
Díky, no nakonec jsem to vyřešil jinak. :-)
int max(int *pole, int N, int i){ // N - velikost pole
if(i==N-1) return i;
else{
int result = max(pole, N, i+1);
if(pole[i]>pole[result]){
result = i;
}
return result;
}
}
void SelectSort(int *pole, int N){
if(N<=1) return;
else{
int MaxIndex = max(pole, N, 0);
int tmp = pole[N-1];
pole[N-1] = pole[MaxIndex];
pole[MaxIndex] = tmp;
SelectSort(pole, N-1);
}
}Offline