Oppure

Loading
13/11/13 14:29
tuttodiMC
Salve a tutti ho pensato di crearmi un algoritmo di ordinamento che ho chiamato Higher Sort. Premetto che è uscito dalla mia testa e se quindi lo trovate scritto da qualche altra parte sappiate che non l'ho copiato.
Ho però un problema con questo. Intanto ecco il codice c#:

public static int[] HigherSort(ref int[] matrice)
        {
            int[] m = matrice;
            int ordinati = 1;
            while (ordinati <= m.Length - 1)
            {
                int max = 0, maxPos = 0;
                for (int i = 0; i < m.Length - ordinati; i++)
                {
                    if (m[i] > max)
                    {
                        maxPos = i;
                        max = m[i];
                    }
                }
                int tmp = m[m.Length - ordinati];
                m[m.Length - ordinati++] = m[maxPos];
                m[maxPos] = tmp;
                for (int i = 0; i < m.Length - 1; i++)
                {
                    if (m[i] > m[i + 1])
                    {
                        tmp = m[i];
                        m[i] = m[i + 1];
                        m[i + 1] = tmp;
                    }
                }
            }
            return m;
        }


Come si può notare è una variante del Bubble Sort, ma lo è perché se non ci fosse l'ultimo ciclo for, una coppia dell' array sarebbe disordinata. Io voglio rimuovere questo ostacolo, ma non ho intenzione di diffondere questo algoritmo. Data la seguente matrice: { 23, 53, 1, 7, 32, 96, 0, 2, 4, 6, 3 };
il risultato senza il ciclo for è:
0
1
2
4
3
6
7
23
32
53
96
mentre con l'ultimo ciclo il 4 ed il 3 sono invertiti e quindi si trovano nelle giuste posizioni. Come mai? Da dove può derivare il problema?
aaa
14/11/13 9:33
HeDo
asd, riuscire a fare una variante più lenta del bubble sort ce ne vuole di impegno :)
aaa
14/11/13 13:26
tuttodiMC
Magari se avessi letto che voglio rimuovere proprio questo, non avresti sprecato un post per dirmi cio che gia sapevo
aaa
14/11/13 21:49
pierotofy
Probabilmente i limiti dettati dalla variabile ordinati saranno sbagliati. Il metodo migliore per capire dove hai sbagliato e' di usare un debugger e seguire passo per passo l'esecuzione della funzione.

Occhio che questa funzione (senza il bubble sort) non funzionera' con numeri negativi...

{ 23, -53, 1, 7, 32, -96, 0, 2, -4, 6, 3 }
Il mio blog: piero.dev
15/11/13 10:25
tuttodiMC
Ho risolto. Il problema era stupido: nel ciclo for il contatore non deve essere minore ma deve essere minore o uguale a m.Length - ordinati.
Adesso verificherò se funge con i numeri negativi e al limite faro un riadattamento.

EDIT: verificato l'algoritmo. Funziona anche con numeri negativi. 8-)
Ultima modifica effettuata da tuttodiMC 15/11/13 10:40
aaa
16/11/13 13:56
Ma non sarai veramente convinto di avere "inventato" qualcosa? Spero veramente che non sia cosi' ...
16/11/13 17:30
tuttodiMC
si lo so è identico al naive sort
aaa
16/11/13 22:54
pierotofy
:k:
Il mio blog: piero.dev