Třídění výběrem minima a maxima – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Třídění výběrem minima a maxima – Pascal – Fórum – Programujte.comTřídění výběrem minima a maxima – Pascal – Fórum – Programujte.com

 

raddino0
Návštěvník
24. 5. 2010   #1
-
0
-

Ahoj,
ve škole sme se učily třídění výběrem minima a maxima, když sem to doma přepsal do pascalu tak mi to netřídí. Pravděpodobně mam něco blbě v sešitě ale i když sem to krokoval a všechno, stejně nemůžu najít chybu. tady je kód:

program MINAMAX;

uses crt;
type POLE=array[0..10] of integer;
var A: POLE;
N,ZAMEN,POROVNANI: integer;
procedure ZAPISPOLE(N:integer;var A:POLE);
var I:integer;
begin
writeln('zadejte prvky');
FOR I:=1 to N do readln(A[I]);
end;
procedure VYPISPOLE(N:integer);
var I:integer;
begin
FOR I:=1 to N do write(A[I],' ');
end;
procedure MINMAX(N:integer; var A:POLE; var ZAMEN: integer; var POROVNANI: integer);
var I,DI,HI,MAXI,MINI,POM: integer;
begin
ZAMEN:=0;
POROVNANI:=0;
DI:=1;
HI:=N;
while DI<HI do
begin
I:=DI;
MAXI:=HI;
MINI:=DI;
for I:=DI to HI do if A[I]>A[MAXI] then A[MAXI]:=A[I];
for I:=DI to HI do if A[I]<A[MINI] then A[MINI]:=A[I];
POM:=A[MAXI];
A[MAXI]:=A[HI];
A[HI]:=POM;
if HI=MINI then MINI:=MAXI;
POM:=A[MINI];
A[MINI]:=A[HI];
A[HI]:=POM;
DI:=DI+1;
HI:=HI-1;
end;
end;

begin
clrscr;
writeln('=====================================================');
writeln('TRIDENI MINIMEM A MAXIMEM');
writeln('zadejte pocet prvku: ');
readln(N);
ZAPISPOLE(N,A);
writeln('zadane prvky: ');
VYPISPOLE(N);
writeln(' ');
MINMAX(N,A,ZAMEN,POROVNANI);
writeln('setridene pole: ');
VYPISPOLE(N);
writeln(' ');
writeln('pocet zamen: ',ZAMEN);
writeln('pocet porovnani: ',POROVNANI);
writeln('=====================================================');
readln;
end.

Nahlásit jako SPAM
IP: 85.207.184.–
Honzc0
Stálý člen
25. 5. 2010   #2
-
0
-

Podle tvé češtiny jsem si nejdříve myslel, že jsi děvče navštěvující dívčí školu. Ale to asi nejsi.
Jinak co se týče třídění, tak se podívej např. sem.
http://www.spsemoh.cz/vyuka/pascal/trideni.htm

Nahlásit jako SPAM
IP: 93.181.78.–
raddino0
Návštěvník
25. 5. 2010   #3
-
0
-

jaj, chybka se vloudila. ten link mi moc nepomohl, než sem psal sem tak sem googlil :) ale my sme si právě řikali přímo o třídění výběrem minima a maxima a to nikde nemůžu najít.

Nahlásit jako SPAM
IP: 85.207.184.–
Grungy0
Super člen
25. 5. 2010   #4
-
0
-

Volá sa to triedenie priamym výberom alebo SelectSort. Princíp spočíva v tom že si pole ktoré chceš triediť rozdelíš na dve časti. Prvá bude obsahovať už utriedené prvky a na začiatku nebude obsahovať žiadny prvok. Druhá časť bude obsahovať zas ešte neutriedené pole a na začiatku tam bude mať veľkosť celého poľa. Zakaždým v tej neutriedenej časti nájdeš minimálny/maximálny prvok a prehodíš ho s prvým prvkom neutriedeného poľa. Usporiadaná časť sa ti tak zväčší o jedno. Toto opakuješ kým usporiadaná časť nie je celé pole.

Nahlásit jako SPAM
IP: 158.193.84.–
Prvý náznak hlúposti, je pocit geniality.
Mircosoft+1
Věrný člen
26. 5. 2010   #5
-
0
-

To raddino : Ten link míří na stránku, kde máš hned na začátku vysvětlení, pod ním - pro případ, že by vysvětlení nestačilo - animaci, pod ním vývojový diagram a napravo v tom modrém rámečku hotový program. Nějak nechápu, co jiného hledáš, když ne tohle :smile11: .

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Jeyekomon0
Stálý člen
26. 5. 2010   #6
-
0
-

Předpokládám, že algoritmy znáš, ale potřeboval bys spíš najít nějakou chybu ve tvém řešení, že? :)

Tak, nezkoumal jsem ten tvůj kód podrobně, ale minimálně jsem si všiml, že jediné, co děláš s proměnnými ZAMEN a POROVNANI, je, že je inicializuješ na nulu:

ZAMEN:=0;
POROVNANI:=0;

A pak je vypíšeš. Takže předpokládám, že se ti vypíšou dvě nuly.

Nahlásit jako SPAM
IP: 78.128.199.–
jjk
raddino0
Návštěvník
26. 5. 2010   #7
-
0
-

Algoritmus mi netřídí. když zadam 3 prvky, 3,2,1 tak se mi po setřídění vypíše 3,2,2 a já nemůžu najít chybu proč to netřídí. zároveň se v algoritmu má počítat počet záměn a porovnání, to sem ještě neřešil, protože mi nefunguje ani třídění. jenom sem si inicializoval proměnné.

Nahlásit jako SPAM
IP: 85.207.184.–
Mircosoft+1
Věrný člen
27. 5. 2010   #8
-
0
-

A chceš to třídit hledáním minima nebo maxima? Nebo obojího najednou? Jestli dobře chápu ten tvůj program, tak asi obojího. Algoritmus musí dělat tohle (pokud třídíš od nejmenšího po největší):

- Nastav dolní index (DI) na první a horní (HI) na poslední prvek pole.
- Opakuj, dokud DI<HI:
-- Najdi nejmenší prvek mezi pozicemi DI a HI a zapamatuj si jeho hodnotu a pozici.
-- Najdi největší prvek mezi pozicemi DI a HI a zapamatuj si jeho hodnotu a pozici.
-- Nalezený nejmenší prvek prohoď s prvkem na pozici DI.
-- Nalezený největší prvek prohoď s prvkem na pozici HI.
-- DI posuň o 1 doprava.
-- HI posuň o 1 doleva.

Prohození dvou prvků pole:
pomocná:=pole[pozice1]
pole[pozice1]:=pole[pozice2]
pole[pozice2]:=pomocná

Nalezení nejmenšího prvku v poli:
- Do proměnné "Nejmenší nalezená hodnota" vlož hodnotu prvního prvku zkoumaného pole.
- Proměnnou "Pozice nejmenšího prvku" nastav na první prvek zkoumaného pole.
- Projdi pole prvek po prvku a pro každý proveď tohle:
-- Pokud je ten prvek menší než Nejmenší nalezená hodnota, tak:
--- Vlož jeho hodnotu do Nejmenší nalezené hodnoty. (tady máš v tom programu chybu, protože ji vkládáš do pole místo do samostatné proměnné)
--- Ulož jeho pozici do Pozice nejmenšího prvku.

Nalezení největšího prvku je podobné:
- Do proměnné "Největší nalezená hodnota" vlož hodnotu prvního prvku zkoumaného pole.
- Proměnnou "Pozice největšího prvku" nastav na první prvek zkoumaného pole.
- Projdi pole prvek po prvku a pro každý proveď tohle:
-- Pokud je ten prvek větší než Největší nalezená hodnota, tak:
--- Vlož jeho hodnotu do Největší nalezené hodnoty.
--- Ulož jeho pozici do Pozice největšího prvku.

Hledání maxima a minima se dá sloučit, takže se provede v jednom průchodu polem, ale není to nutné.

Pro celé třídění tedy potřebuješ tyto proměnné:
- Nejmenší nalezená hodnota
- Pozice nejmenšího prvku
- Největší nalezená hodnota
- Pozice největšího prvku
- Dolní index
- Horní index
- Pomocný index pro procházení pole
- Pomocná proměnná na výměny prvků
Vidím, že jich máš o dvě míň, tak proto ti to nemůže fungovat.

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý