Merge-Sort funkční pouze pro 2^n čísel?? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Merge-Sort funkční pouze pro 2^n čísel?? – C / C++ – Fórum – Programujte.comMerge-Sort funkční pouze pro 2^n čísel?? – C / C++ – Fórum – Programujte.com

 

TomBar0
Newbie
28. 9. 2010   #1
-
0
-

Nevím proč mi tento Merge sort funguje, pouze když mu zadám k setřídění počet čísel 2, 4, 8, 32, 64...
Zkoušel jsem si to už několikrát projít se zadanými čísly a chybu nemůžu nikde najít

#include <iostream>

#include <ctime>

using namespace std;

void Merge(int Left[],int L_Lenght,int Right[],int R_Lenght,int Array[])
{
int i=0;
while(L_Lenght>0||R_Lenght>0)
{
if(L_Lenght>0&&R_Lenght>0)
{
if(Left[0]<Right[0])
{
Array[i]=Left[0];cout<<Array[i];cout<<endl<<Array[i]<<endl;
i++;
for(int n=0;n<L_Lenght-1;n++){
Left[n]=Left[n+1];}
L_Lenght--;
}
else
{
Array[i]=Right[0];
i++;
for(int n=0;n<R_Lenght-1;n++){
Right[n]=Right[n+1];}
R_Lenght--;
}
}
else
{
if(L_Lenght>0)
{
Array[i]=Left[0];
i++;
for(int n=0;n<L_Lenght-1;n++){
Left[n]=Left[n+1];}
L_Lenght--;
}
else
{
Array[i]=Right[0];
i++;
for(int n=0;n<R_Lenght-1;n++){
Right[n]=Right[n+1];}
R_Lenght--;
}
}
}
}

void MergeSort(int A[],int Lenght)
{
int Array[Lenght];
int Middle=Lenght/2;
int L_Lenght=Middle;
int R_Lenght=Lenght-Middle;
int Left[L_Lenght];
int Right[R_Lenght];
for(int n=0;n<L_Lenght;n++)
{
Left[n]=A[n];
}
for(int n=R_Lenght,m=0;n<Lenght;n++,m++)
{
Right[m]=A[n];
}
if(L_Lenght>1)
{
MergeSort(Left,L_Lenght);
}
if(R_Lenght>1)
{
MergeSort(Right,R_Lenght);
}
Merge(Left,L_Lenght,Right,R_Lenght,A);
}


int main()
{
// int nmb[3]={4,3,2};
// int nmb[10]={1,8,7,1,1,1,1,3,2,1};
// int nmb[10]={1,5,2,6,7,3,2,1,2,3};
// int nmb[10]={1,2,3,4,5,6,7,8,9,10};
int nmb[3];
srand((unsigned)time(0));
for(int a=0;a<3;a++){
nmb[a] = rand();
cout<<nmb[a]<<" ";}
cout<<endl;


MergeSort(nmb,3);
for(int n=0;n<3;n++)
{
cout<<nmb[n]<<" ";
}



cin.get();cin.get();
return 0;
}

Dík za odpovědi

Nahlásit jako SPAM
IP: 217.229.29.–
prt
~ Anonymní uživatel
1 příspěvek
28. 9. 2010   #2
-
0
-

Chyba je tady:

int Middle=Lenght/2;

Příště si to nejdřív zkus odkrokovat. Tam bys to viděl hned při prvním průchodu.

Nahlásit jako SPAM
IP: 86.61.140.–
TomBar0
Newbie
28. 9. 2010   #3
-
0
-

Pokud tim odkrokovat máš na mysli projít to s konkrétníma zadanejma číslama krok po kroku, tak to jsem přesně udělal a v

int Middle=Lenght/2;
stále nevidím problém:
Pošlu 3 čísla - Lenght=3; Middle=1;Lenght-Middle=2. Takže L_Lenght=1 => nebude se dál dělit, zatímco Right[0] a Right [1] se seřadí.
Jestli bys mi prosím mohl říct, v čem konkrétně je tam tedy ta chyba...

Nahlásit jako SPAM
IP: 217.229.29.–
TomBar0
Newbie
28. 9. 2010   #4
-
0
-

Díky, už jsem si to našel - chyba byla na 64 řádku, mělo tam být

for(int n=L_Lenght,m=0;n<Lenght;n++,m++)
místo
for(int n=R_Lenght,m=0;n<Lenght;n++,m++)
. Teď to už to funguje bezproblémů :-)

Nahlásit jako SPAM
IP: 217.229.29.–
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, 42 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ý