Avatar
Štefan Pružinský:

Čaute, mám pole so 117 prvkami, minimom 0 a maximom 765. Chcel by som sa opýtať, ktorý triediaci algoritmus je v tomto prípade najvhodnejšie použiť. Ide mi hlavne o Counting sort vs. Insertion sort. Na tento výpočet som hľadal nejakú aplikáciu, avšak nič vhodné som nenašiel. Vopred ďakujem za odpoveď.
PS. Nie je to úloha do školy, potrebujem to do svojej aplikácie.:)

Editováno 8.3.2015 19:30
Odpovědět 8.3.2015 19:28
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štefan Pružinský
Jan Vargovský:

Nemá cenu vybírat vhodný algoritmus pro 100 prvků. Použij normálně ten co je implementovany v .NETu.

Btw, ani jeden ze tvých algoritmů bych rozhodně nepoužil. Insertion sort je jednoduše pomalý a na counting sort je to velký rozsah čísel. V dnešní době se používa QuickSort. Popřípadě jestli máš pole, které má velikost v řádek desítek a není uvnitř jazyku už nějaký uvnitř, tak si rychle naimplementuješ bubble sort.

 
Nahoru Odpovědět 8.3.2015 20:08
Avatar
Odpovídá na Jan Vargovský
Štefan Pružinský:

Array.Sort, použiť nemôžem, pretože tie čísla ťahám zo string poľa, kde sa jeden string skladá z 9 charov, ktoré rozdelím na 3 časti, naparsujem do int a sčítam. Následne s tým číslom pracujem.
Inak prečo práve Bubble, veď Insertion je rýchlejší než Bubble.

Nahoru Odpovědět 8.3.2015 20:19
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štefan Pružinský
Jan Vargovský:

V jaké části toho celého procesu to pole sortuješ?

 
Nahoru Odpovědět 8.3.2015 20:26
Avatar
Štefan Pružinský:

Príklad.:

pole[0] = "000051255";
...
string prvok = pole[0];
string memory = "";
int sucet = 0;

//tá 000 proste vyhodí 0, 051 - 51, 255 - 255
memory += prvok[0];
memory += prvok[1];
memory += prvok[2];
sucet += int.Parse(memory);
memory = "";

memory += prvok[3];
memory += prvok[4];
memory += prvok[5];
sucet += int.Parse(memory);
memory = "";

memory += prvok[6];
memory += prvok[7];
memory += prvok[8];
sucet += int.Parse(memory);
memory = "";

Ten kód hore, je funkcia pomocou ktorej, vytvorím v potrebný okamžik súčet tých troch čísel. A teda - triedim pole stringov, na základe súčtu troch čísel nachádzajúcich sa v danom stringu.

Editováno 8.3.2015 20:47
Nahoru Odpovědět 8.3.2015 20:44
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štefan Pružinský
Jan Vargovský:

No jasně, ale v jaké části to sortuješ?

Jinak pár připomínek k tomu kódu.

Máš string, který se skládá z 9 číslic. Ty rozdělíš po 3 číslicích a ty sečteš. Kdybych se bavil o výkonu, tak tam vytváříš snad 10 instancí úplně zbytečně, protože string je immutable.

int soucet = int.Parse(pole.Substring(0, 3)) + int.Parse(pole.Substring(3, 3)) + int.Parse(pole.Substring(6, 3));
 
Nahoru Odpovědět  +1 8.3.2015 21:39
Avatar
Odpovídá na Jan Vargovský
Štefan Pružinský:

Máš pravdu, ale bol to len príklad. V skutočnosti som to do programu ešte neimplementoval, ale každopádne dobrá pripomienka.:)
Inak prečo ten Bubble?

Nahoru Odpovědět 8.3.2015 21:52
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štefan Pružinský
Jan Vargovský:

Z hlediska efektivity programování ho máš napsaný za pár minut. A při třídění 100 prvků je to celkem jedno, proto :) Jinak co má být výsledkem? Ty jednotlivé součty máš, které si vypočítal?

Editováno 8.3.2015 22:38
 
Nahoru Odpovědět 8.3.2015 22:38
Avatar
Odpovídá na Jan Vargovský
Štefan Pružinský:

Robím tohto machra: http://www.itnetwork.cz/…198e32c9c602. To zotriedenie použijem na zotriedenie palety (poľa) farieb podľa sýtosti (tmavosti). Malo by platiť - čim menší súčet, tým tmavšia farba (čierná - 0,0,0).

Nahoru Odpovědět 8.3.2015 23:03
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štefan Pružinský
Jan Vargovský:

Vytvoříš si normálně třídu, která reprezentuje ty 3 barvy. A pak máš několik možností, jak rozsortovat nějakou kolekci. Já osobně bych použil implementaci IComparable. Viz kód níže.

public sealed class Color : IComparable<Color>
{
    public int R { get; private set; }
    public int G { get; private set; }
    public int B { get; private set; }

    internal int Value
    {
        get { return this.R + this.G + this.B; }
    }

    public Color() : this(0, 0, 0) { }

    public Color(int r, int g, int b)
    {
        this.R = r;
        this.G = g;
        this.B = b;
    }

    public int CompareTo(Color other)
    {
        int value = Value;
        int otherValue = other.Value;

        if (value > otherValue)
            return 1;
        else if (value < otherValue)
            return -1;
        else
            return 0;
    }
}

Použití

Color[] colors = new Color[]
{
    new Color(0,100,200),
    new Color(200,100,200),
    new Color(200,200,200),
    new Color(100,100,100),
    new Color(0,0,0),
    new Color(200,200,0)
};
for (int i = 0; i < colors.Length; i++)
    Debug.Write(colors[i].Value + " ");
Debug.WriteLine(null);
Array.Sort(colors);
for (int i = 0; i < colors.Length; i++)
    Debug.Write(colors[i].Value + " ");
Debug.WriteLine(null);
Akceptované řešení
+20 Zkušeností
Řešení problému
 
Nahoru Odpovědět  +1 10.3.2015 18:17
Avatar
Odpovídá na Jan Vargovský
Štefan Pružinský:

Mal som to už ako pole Stringov, tým pádom som to poriešil takto:

public string[] ZoradFarby()
{
    string[] poleColor = new string[poleFarieb.Length];
    Array.Copy(poleFarieb, poleColor, poleFarieb.Length);
    string temp;
    for (int i = 0; i < poleColor.Length; i++)
    {
        for (int j = i; j < poleColor.Length; j++)
        {
            if (int.Parse(poleColor[j].Substring (0, 3)) + int.Parse(poleColor[j].Substring(3, 3)) + int.Parse(poleColor[j].Substring(6,3)) < int.Parse(poleColor[i].Substring (0, 3)) + int.Parse(poleColor[i].Substring(3, 3)) + int.Parse(poleColor[i].Substring(6,3)))
            {
                temp = poleColor[j];
                poleColor[j] = poleColor[i];
                poleColor[i] = temp;
            }
        }
    }
    return poleColor;
}

Tvoje riešenie je však z programátorského hľadiska určite lepšie. Diki

Nahoru Odpovědět 12.3.2015 9:28
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štefan Pružinský
Jan Vargovský:

Np :)

David Čápka Podle čeho se určuje jestli dostanu bod nebo ne? :)

 
Nahoru Odpovědět 12.3.2015 13:59
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.