Třídění pomocí algoritmu MergeSort – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Třídění pomocí algoritmu MergeSort – .NET – Fórum – Programujte.comTřídění pomocí algoritmu MergeSort – .NET – Fórum – Programujte.com

 

paul270
Návštěvník
7. 9. 2008   #1
-
0
-

dobrý podvečer.

před nedávnem jsem narazil na tento algoritmus a tak jsem si říkal, že bych si ho napsal v C#, bohužel mi to moc nejde. myslím, že princip chápu, ovšem syntaxe je špatná (neumím to napsat), ptž program prostě nefunguje. přidávám sem radši hlavní části kódu, byl bych rád, kdyby jste mi poradili, kde dělám chybu (nemusíte psát kód, stačí slovně). díky.

třída, kde by se mělo vše setřídit:

class Trideni

{
int[] pole;
int[] pole2;

public Trideni(int delka)
{
pole = new int[delka];
pole2 = new int[delka];
}

public void NaplnPole(int hodnota, int index)//metoda pro naplnění pole
{
pole[index] = hodnota;
}

public int VypisPole(int index)//pro výpis hodnot jednotlivých indexů pole
{
return pole[index];
}

public void Setrid(int pocatek, int delka)//metoda pro setřídění
{
if (delka == 1)
{
return;
}
else if (delka == 2)//pokud jsou čísla ve "špatném" pořadí, prohodím
{
if (pole[pocatek] > pole[pocatek + 1])
{
int help = pole[pocatek];
pole[pocatek] = pole[pocatek + 1];
pole[pocatek + 1] = help;
}
}
else//pokud délka pole > 2, tak rozdělím na 1/2 a znova volám tuto metodu
{
int pocatek1 = pocatek;
int delka1 = delka / 2;
int pocatek2 = pocatek1 + delka1;
int delka2 = delka - delka1;

Setrid(pocatek1, delka1);
Setrid(pocatek2, delka2);

Spoj(pocatek1, delka1, pocatek2, delka2);
}
}

public void Spoj(int pocatek1, int delka1, int pocatek2, int delka2)//spojuji dva již setříděné úseky
{
int k = pocatek1;
int l = pocatek2;
int vyber = 0;

while (k < delka1 || l < delka2)
{
if (k >= delka1)
{
vyber = 2;
}
else if (l >= delka2)
{
vyber = 1;
}
else
{
if (pole[k] < pole[l])
{
vyber = 1;
}
else
{
vyber = 2;
}
}

if (vyber == 1)
{
pole2[k + l] = pole[k];
k++;
}
else
{
pole2[k + l] = pole[l];
l++;
}

for (int i = 0; i < pole2.Length; i++)
{
pole[i] = pole2[i];
}
}
}
}


metoda Main:
Console.Write("Zadej delku pole: ");

int delka = Convert.ToInt32(Console.ReadLine());
Trideni t = new Trideni(delka);
Random rnd = new Random();

for (int i = 0; i < delka; i++)
{
t.NaplnPole(rnd.Next(0, 101), i);
}
t.Setrid(0, delka);
for (int i = 0; i < delka; i++)
{
Console.Write(t.VypisPole(i) + ", ");
}

Nahlásit jako SPAM
IP: 88.103.71.–
KIIV
~ Moderátor
+43
God of flame
7. 9. 2008   #2
-
0
-

proc zrovna mergesort :? sem se s nim teda mockrat nesetkal... to uz je lepsi quicksort

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
paul270
Návštěvník
7. 9. 2008   #3
-
0
-

já se neptám, jaký algoritmus mám používat, ale proč mi mergesort nefunguje.

Nahlásit jako SPAM
IP: 88.103.71.–
mephi0
Expert
7. 9. 2008   #4
-
0
-

Na čo nefunguje ? nezoradi pole ? nezkompiluje ? spadne za behu ?

na prvy pohľad to vyzera dobre, ale hľadať chybu takto naslepo sa mi nechce.

Nahlásit jako SPAM
IP: 85.248.56.–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
KIIV
~ Moderátor
+43
God of flame
7. 9. 2008   #5
-
0
-

to chce trasovat ... vypisovat kazdej krok a sledovat kde to nedela to co ma

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
paul270
Návštěvník
7. 9. 2008   #6
-
0
-

žádná chyba, ani program nespadne za běhu - to bych sem nepsal.

problém je v tom, že se to nesetřídí + čísla co zadám se ani nevypíšou - no podívejte se sami na výstup: http://img231.imageshack.us/my.php?image=sortyf1.gif

ano, čísla generuju, ale je to stejné i kdybych je zadal ručně.

Nahlásit jako SPAM
IP: 88.103.71.–
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, 18 hostů

 

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