Avatar billede webcreator Nybegynder
19. oktober 2004 - 21:29 Der er 17 kommentarer og
2 løsninger

Finde 4 yngste personer i array

Hej Eksperter.

Jeg har brug for et par råd til, hvordan jeg ud fra et array med 100 indtastninger (alder på 100 personer) kan finde de 4 mindste tal og udskrive disse.

Jeg har en ide om, at jeg skal oprette et array der kan indeholde de mindste tal, og så tjekker jeg løbende om mod dette array. Men da arrayet gerne skulle sorteres med mindste tal først, så bliver det altså noget omstændigt.

Nogen gode råd? - Gerne så brugervenlige ideer som muligt - er ny i det her :)
Avatar billede dna Nybegynder
19. oktober 2004 - 21:34 #1
Du kan kigge på Array.Sort() metoden! Den skulle gerne kunne klare det for dig!

dna
Avatar billede webcreator Nybegynder
19. oktober 2004 - 21:35 #2
Hm, jeg tror faktisk det nemmeste er, at finde det mindste tal først ved ét gennemløb. Herefter ekskluderes det fundne tal, og arrayet gennemløbes igen - sådan bliver jeg ved 4 gange. Det virker da fornuftigt, ikke ? :)
Avatar billede webcreator Nybegynder
19. oktober 2004 - 21:35 #3
Nåda - den vil jeg da undersøge :)
Avatar billede dna Nybegynder
19. oktober 2004 - 21:37 #4
Din metode er ikke dum! Den vil kun gennemløbe array´et 4 gange jo! Hvor .Sort() metoden jo udnytter QuickSort algoritmen, og sorterer hele arrayet! Hvis du ved noget om tidskompleksitet, så er det jo en O(n^2) - hvor din vil være O(4n).

Men, det er selvfølgelig lettere bare at bruge .Sort(), og hvis ikke tid er en kritisk faktor i din applikation, så ville jeg nok bruge den! :-)

dna
Avatar billede arne_v Ekspert
19. oktober 2004 - 21:57 #5
1)

Der er ikke noget som hedder O(4n) - det hedder stadigvæk O(n) - man ignorerer
proportionalitets faktorne i big O analyse

2)

Det kan gøres med et enkelt gennemløb !
Avatar billede webcreator Nybegynder
19. oktober 2004 - 22:15 #6
Ok, jeg kender desværre ikke til noget at det i nævner - men jeg kan da fortælle at min metode virkede perfekt :))
Avatar billede webcreator Nybegynder
19. oktober 2004 - 22:16 #7
Arne > Dvs. at min metode stadig er langsommere (ja, vi snakker vel ms.) end O(n) ?
Avatar billede arne_v Ekspert
19. oktober 2004 - 22:21 #8
Sandsyneligvis betyder det intet som helst om det er 1 eller 4 gennemløb i praksis.
Avatar billede arne_v Ekspert
19. oktober 2004 - 22:21 #9
Eksempel på 1 gennem løb:

using System;

class MainClass
{
    public static int[] FindFourSmallest(int[] a)
    {
        int[] res = new int[4];
        for(int j = 0; j < 4; j++) res[j] = int.MaxValue;
        for(int i = 0; i < a.Length; i++)
        {
            if(a[i] < res[3])
            {
                res[3] = a[i];
                for(int j = 3; j > 0; j--)
                {
                    if(res[j] < res[j-1])
                    {
                        int tmp = res[j];
                        res[j] = res[j-1];
                        res[j-1] = tmp;
                    }
                }
            }
        }
        return res;
    }
    public static void Main(string[] args)
    {
        int[] a = { 3, 2, 1, 9, 8, 7, 6, 5, 4, 11, 12 };
        int[] small4 = FindFourSmallest(a);
        for(int j = 0; j < 4; j++) Console.WriteLine(small4[j]);
    }
}
Avatar billede dna Nybegynder
20. oktober 2004 - 07:17 #10
arne_v: Ved godt at man ikke skriver den slags faktorer i O(), men syntes bare det gør det lettere at forklare det sådan, men rigtigt.. det hedder bare O(n).

Du ligger sq meget energi i at give et godt svar! - er godt at se!

webcreator: Fandt du ud af det?

dna
Avatar billede sovsekoder Nybegynder
20. oktober 2004 - 09:24 #11
webcreator: med 2 algoritmer af samme orden, er det ikke ligemeget hvad man laver af operationer på hvert element. så eet gennemløb er ikke nødvendigvis bedre end 4.
Avatar billede arne_v Ekspert
20. oktober 2004 - 10:30 #12
sovsekoder>

Jeg tror at webcreator er så bedøvende ligeglad med O(n) og diverse
subtile hastigheds finesser.

Jeg tror at 1 gennemløb med mini sort er hurtigere end 4 gennemløb i dette
tilfælde.

Så vidt jeg kan se vil antal sammenligninger i worst case være det samme og i best case 1/4. Og jeg tror ikke at swap kan opveje det.
Avatar billede sovsekoder Nybegynder
20. oktober 2004 - 10:44 #13
ville nu bare hjælpe webcreator...
Avatar billede petersteph Nybegynder
23. oktober 2004 - 00:56 #14
Hvis der kun er 100 elementer er Array.Sort OK:
static void Main(string[] args)
{
    int[] a = {3,2,1,9,8,7,6,5,4,11,12};
    Array.Sort(a);
    for(int j=0;j<4;j++) Console.WriteLine(a[j]);
}
Avatar billede fastpoint Nybegynder
23. oktober 2004 - 23:38 #15
Nu aner jeg minus om C# men da det minder om Java har jeg følgende kode til formålet... skal evt tilrettes med hensyn til syntax..
Laver eksemplet som snakkede vi om der kun var 10 personer.

int[] yngste = {2,1,9,8,7,6,5,4,11,12};

int min, temp;
//først sortere vi lige vores array
for (int index = 0; index < yngste.length-1; index++)
{
  min = index;
  for (int scan = index+1; scan < yngste.length; scan++)
    if (yngste[scan] < numbers[min])
      min = scan;

temp = numbers[min];
numbers[min] = numbers[index];
numbers[index] = temp;
}

Console.WriteLine("De fire yngste er "]);
Console.WriteLine("/n"]);
//så finder vi de fire yngste

for (int i = 0; i < 4; i++)
{

Console.WriteLine(yngste[i]);

}


Ved så ikke om jeg forstod dit spørgsmål rigtigt hehe men du kan prøve koden... og ved ikke om jeg har brugt Console.Writeline rigtigt.. kender som sagt kun til java;)
Avatar billede fastpoint Nybegynder
23. oktober 2004 - 23:42 #16
hmm tror egentlig jeg har forstået dit spørgsmål rigtigt og så virker min kode dag også

du skal lige huske kroppen til min kode altså

using System;

class MainClass
{


og en sidste "}" til sidst..

Hvis din kode skal udskrive navnene på de 4 yngste og ikke alderen kunne du evt. lave en classe hvor der står navn og alder på de forskellige.. så kan man lave et array som kan referere til objekter og dermed lave objekter af den klasse.
Avatar billede dna Nybegynder
24. oktober 2004 - 16:00 #17
fastpoint: Vi har i starten af spørgsmålet lagt fast at sortere et array bare kan gøres ved Array.Sort(), hvorfor begynder du så at lave en måde til at gøre det manuelt? Virker lidt malplaceret. Ligesom petersteph´s gentagelse af andre´s svar.

Det er måske bare mig...

dna
Avatar billede arne_v Ekspert
24. oktober 2004 - 16:04 #18
Jeg undrede mig også lidt over de sidste 2 deltageres "bidrag".
Avatar billede fastpoint Nybegynder
24. oktober 2004 - 19:12 #19
Dna:


Som du selv siger... i lagde fast at det kan gøres ved hjælp af Array.Sort(), men nu kender jeg ikke metoden så derfor lagde jeg fast at man bare kunne gøre det manuelt... og hvad er der egentlig galt i det? Synes da det er meget praktisk, at man kan se koden for sig og det lære mig da også mere af...

Synes i hvertfald at din sidste kommentar er af mindre værdi end mine bidrag.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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