Confronto del mio inserimento Ordinamento rispetto all'algoritmo standard

2

Vengo da uno sfondo di creazione di siti Web MVC e applicazioni HTML5 e di recente ho deciso di immergermi nel genere di cose che non mi è stato insegnato all'università, ovvero le cose che la maggior parte delle persone apprenderebbe in un corso di informatica.

Ho letto un libro sugli algoritmi e il primo a menzionare è l'Insertion Sort. Non l'ho capito davvero la prima volta, ma ho capito l'obiettivo, quindi ho avuto una brutta esperienza con la mia soluzione prima di leggere di più nella soluzione corretta per vedere quanto mi sono avvicinato.

Mi sono avvicinato molto, ed ecco la mia funzione in C #:

    int[] SortNumbersTomsVersion(int[] numbersIn)
    {
        int[] output = new int[numbersIn.Count()];

        for (var i = 0; i < numbersIn.Count(); i++) 
        {
            int cardsLowerThan = 0;

            for (var n = 0; n < numbersIn.Count(); n++) 
            {
                if (numbersIn[n] < numbersIn[i]) 
                {
                    cardsLowerThan++;
                }
            }
            output[cardsLowerThan] = numbersIn[i];
        }
        return output;
    }

Il concetto è che, comincio con un gruppo di numeri. Quindi, per ciascun numero, lo confronto con tutti gli altri numeri nell'array, per vedere quanti altri hanno un valore inferiore. Quindi prende il conteggio risultante e posiziona il numero corrente in una matrice di output in quell'indice. L'algoritmo passa attraverso tutti i numeri finché non si trovano tutti nella stessa posizione.

La mia domanda è, cosa rende l'originale migliore della mia soluzione ?

come riferimento, ecco l'algoritmo accettato al di fuori di una funzione:

    int temp, k;
    for (int i = 1; i < array_size; i++) 
    {
        temp = array[i];
        k = i - 1;
        while (k >= 0 && array[k] > temp) 
        {
            array[k + 1] = array[k];
            k--;
        }
        array[k + 1] = temp;
    }
    
posta Tom 23.08.2012 - 15:50
fonte

1 risposta

5

Confrontando le prestazioni di 2 algoritmi, presupponendo che entrambi funzionino correttamente, coinvolgono diversi fattori come spazio, velocità, ecc. Senza un'analisi dettagliata, il tuo codice ha nidificato per cicli ciascuno vincolato da (n) iterazioni:

for (var i = 0; i < numbersIn.Count(); i++) 
     {   
            ...

            for (var n = 0; n < numbersIn.Count(); n++) ...}}

questo richiede O (n * n) anche nel migliore dei casi (quando gli elementi sono già ordinati). L'algoritmo di ordinamento per inserimento dovrebbe essere O (n) nel migliore dei casi vedere: Wiki-InsertionSort .

    
risposta data 23.08.2012 - 16:03
fonte

Leggi altre domande sui tag