Avatar billede arriva Nybegynder
16. december 2003 - 21:35 Der er 12 kommentarer og
1 løsning

Selectionsort algoritme

Hey Eksperter!
Jeg har lavet følgende selectionsort algoritme, som skal sorterer et array (randnumArr). Problemet er at den kun sorterer nogle af tallene... Dvs. f.eks. de første 8805 af talene ligger sorteret som de skal (skriver dem ud til en fil), men resten ligger random ud af f.eks. 10000 tal...

    i = 0;
    t = i+1;
    long int min, p;
    Selectionsort_begin:
    min = randnumArr[i];
    while (t != arraymax)
    {
        if (randnumArr[t] < min)
        {
              min = randnumArr[t];
              p = t;
        }
        t++;
    }
    if (min != randnumArr[i])
    {
        randnumArr[p] = randnumArr[i];
        randnumArr[i] = min;
        i++;
        t = i+1;
        goto Selectionsort_begin;
    }
Avatar billede erikjacobsen Ekspert
16. december 2003 - 21:43 #1
Det er jo nok fordi den er forkert. Du gentager kun sorteringen hvsi du laver
en ombytning. Kommer du til et element, der faktisk og tilfældigvis står
på sin rette plads, så stopper du.

Lav en almindelig for løkke yderst - du ved jo hvor mange gange du skal igennem
(og glem alt om goto)
Avatar billede arne_v Ekspert
16. december 2003 - 21:52 #2
Jeg har en select sort konverteret fra Pascal som ser ud som:

void selectsort(int *a, int n)
{
    int i,j,ix,tmp;
    for(i=0;i<(n-1);i++)
    {
        ix = i;
        for(j=(i+1);j<n;j++) if(a[j]<a[ix]) ix=j;
        tmp = a[ix];
        a[ix] = a[i];
        a[i] = tmp;
    }
}
Avatar billede arriva Nybegynder
16. december 2003 - 22:13 #3
jeg har prøvet at omskrive det til mit program:

    long int min, i, t, p, tmpVar;
    for (i=0; i<(t-1); i++)
    {
        min = i;
        for (p=(i+1); p<t; p++)
        {
            if(randnumArr[p] < randnumArr[min])
            {
                min = p;
            }
            tmpVar = randnumArr[min];
            randnumArr[min] = randnumArr[i];
            randnumArr[i] = tmpVar;
        }
    }


nu sorterer den imidlertid ikke nogle enkelte af talene i starten af filen, ellers ser resten ok ud... hvis jeg kører 10 tal er der ingen fejl, men med 10000 tal er der omkring 5-10 fejl, såvidt jeg kan se...
Avatar billede arriva Nybegynder
16. december 2003 - 22:15 #4
hvis man f.eks. sorterer 100 forskellige tal, får man følgende resultat:
9343835
18503114
62163302
67315725
75400005
174240225
35074943
187371488
226162995
232531715
275528542
349041538
...herfra er tallene sorteret korrekt
Avatar billede erikjacobsen Ekspert
16. december 2003 - 22:17 #5
Får t en startværdi?
Avatar billede arriva Nybegynder
16. december 2003 - 22:24 #6
ja, den er lig med array størrelse...
Avatar billede arriva Nybegynder
16. december 2003 - 22:25 #7
det er skummelt, det er åbenbart forskelligt hvornår den gør det.. har prøvet med 100 tal, der laver den fejl, prøvede med 10000 der gik det godt nok...
Avatar billede arne_v Ekspert
16. december 2003 - 22:25 #8
Mystisk - jeg kan godt sortere 10000 tal uden fejl.
Avatar billede erikjacobsen Ekspert
16. december 2003 - 22:27 #9
Jeg kan ikke se i din kode, arriva, at t får en startværdi. Vil du ikke
godt vise os den faktiske kode.
Avatar billede arne_v Ekspert
16. december 2003 - 22:29 #10
Hov jeg kan se en forskel på din og min kode.

Jeg har swap udenfor inderste løkke - du har den indenfor !
Avatar billede arriva Nybegynder
16. december 2003 - 22:41 #11
Ha! arne_v det så sq ud til at gøre det!
Du er gud, eller også er jeg bare nubi :)

nu havde jeg ellers lige siddet og ryddet op i den forholdsvis lange kode, for at poste den til erikjacobsen...

anyway, tak for hjælpen begge to!
Avatar billede arriva Nybegynder
16. december 2003 - 22:43 #12
arne_v: hvis du ligger et svar, skal du nok få point.
Avatar billede arne_v Ekspert
16. december 2003 - 22:44 #13
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester