Matematické Fórum

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

#1 09. 05. 2015 14:26

byk7
InQuisitor
Příspěvky: 4713
Reputace:   221 
 

Třídění bez cyklu

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.


Příspěvky psané červenou barvou jsou moderátorské, šedá je offtopic.

Offline

  • (téma jako vyřešené označil(a) byk7)

#2 10. 05. 2015 00:06

check_drummer
Příspěvky: 5513
Reputace:   106 
 

Re: Třídění bez cyklu

↑ 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...


"Máte úhel beta." "No to nemám."

Offline

 

#3 10. 05. 2015 00:09

byk7
InQuisitor
Příspěvky: 4713
Reputace:   221 
 

Re: Třídění bez cyklu

Zakázáno je použít while, for a repeat. Samozřejmě je tu možnost použít nějaké příkazy skoku, ale to se mi moc nelíbí.


Příspěvky psané červenou barvou jsou moderátorské, šedá je offtopic.

Offline

 

#4 11. 05. 2015 19:27

Bati
Příspěvky: 2469
Reputace:   192 
 

Re: Třídění bez cyklu

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

 

#5 11. 05. 2015 21:31

byk7
InQuisitor
Příspěvky: 4713
Reputace:   221 
 

Re: Třídění bez cyklu

Takže něco jako

Code:

rekurzivni_cyklus(unsigned int i; unsigned int max){   
   if(i<max) return rekurzivni_cyklus(i+1; max)
}

?


Příspěvky psané červenou barvou jsou moderátorské, šedá je offtopic.

Offline

 

#6 11. 05. 2015 21:40

Bati
Příspěvky: 2469
Reputace:   192 
 

Re: Třídění bez cyklu

Offline

 

#7 12. 05. 2015 16:39

byk7
InQuisitor
Příspěvky: 4713
Reputace:   221 
 

Re: Třídění bez cyklu

Když jsme kdysi Quicksort programovali, dostali jsme něco takového

Code:

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!!!


Příspěvky psané červenou barvou jsou moderátorské, šedá je offtopic.

Offline

 

#8 20. 05. 2015 19:44

Wrunx
Příspěvky: 65
Reputace:   
 

Re: Třídění bez cyklu

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

 

#9 20. 05. 2015 20:02

byk7
InQuisitor
Příspěvky: 4713
Reputace:   221 
 

Re: Třídění bez cyklu

Díky, no nakonec jsem to vyřešil jinak. :-)

Code:

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);
   }
}

Příspěvky psané červenou barvou jsou moderátorské, šedá je offtopic.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson