Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    MergeSort C#

    Qualcuno può spiegarmi come utilizzare il MargeSort in C#??

    In particolare questo codice di esempio:

    public class Sort
    {
    public void Ordina(int[] vett)
    {
    int[] tmpVett; // vettore di appoggio
    tmpVett = new int [vett.Lenght];
    // chiama al vero metodo di ordinamento ricorsivo dove primo = 0 e ultimo = vett.Lenght-1
    mergeSort(vett, tmpVett, 0, vett.Lenght-1);
    }

    private void mergeSort(int[] vett, int[] tmpVett, int primo, int ultimo)
    // è neccessario passare un vettore di appoggio, il primo e l' ultimo indice utile del vettore da ordinare.
    {
    if(primo < ultimo) // il vettore ha almeno un elemento
    {
    int medio = (primo + ultimo) / 2; // indice centrale
    mergeSort(vett, tmpVett, primo, medio); // chiamata ricorsiva 1° metà
    mergeSort(vett, tmpVett, medio + 1, ultimo); // chiamata ricorsiva 2° metà
    merge(vett, tmpVett, primo, medio + 1, ultimo); // fusione (eseguito alla fine)
    }
    }

    private void merge(int[] vett, int[] tmpVett, int indice1, int indice2, int fine2)
    {
    // il sottovettore1 finisce una posizione prima dell' inizio del sottovettore2
    int fine 1 = indice2 - 1;
    int inizio = indice 1; // puntatore all' indice iniziale
    int indiceTemp = indice1; // indice per copiare i dati della fusione in tmpVett

    // se ho ancora elementi da scorrere in entrambi i sottovettore
    while (indice1 <= fine1 && indice2 <= fine2)
    if((vett[indice1]) < (vett[indice2])) // se è il più piccolo in posiz. indice1
    {
    tmpVett[indiceTmp] = vett[indice1]; // copio in vettTemp
    indice1++; // incremento il cursore del sottovettore1
    indiceTmp++; // incremento il valore del cursore in tmpVett
    }
    else
    {
    tmpVett[indiceTmp] = vett[indice2];
    indice2++; // incremento il cursore del sottovettore2
    indiceTmp++; // incremento il valore del cursore in tmpVett
    }
    // Se si esce dal primo while significa che uno dei sottovettori è terminato
    while(indice1 <= fine1) // il sottovettore1 non è ancora terminato
    // finisco di copiare in tempVett gli elementi in sottovettore1
    {
    tmpVett[indiceTmp] = vett[indice1];
    indice1++;
    indiceTmp++;
    }
    while (indice2 <= fine2) // il sottovettore2 non è ancora terminato
    // finisco di copiare in tempVett gli elementi rimasti in sottovettore2
    {
    tmpVett[indiceTmp] = vett[indice2];
    indice2++;
    indiceTmp++;
    }

    // copia dei valori dal vettore temporaneo al vettore passato come parametro
    for(int i = inizio; i <= fine2; i++)
    {
    vett[i] = tmpVett[i];
    }
    }
    }

    Il codice è funzionante e vorrei capire come funziona questa marea di roba. Grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480

    Moderazione

    Originariamente inviato da MauroCutrona
    Qualcuno può spiegarmi come utilizzare il MargeSort in C#??
    [...]
    Il codice è funzionante e vorrei capire come funziona questa marea di roba. Grazie
    Poni una domanda specifica.

    Qui si da una mano a scrivere il codice, ma spiegare per filo e per segno un listato preso chissà dove non è proprio l'obiettivo del forum.

    P.S.: sposto la discussione nel forum appropriato.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Re: Moderazione

    Originariamente inviato da alka
    Poni una domanda specifica.

    Qui si da una mano a scrivere il codice, ma spiegare per filo e per segno un listato preso chissà dove non è proprio l'obiettivo del forum.

    P.S.: sposto la discussione nel forum appropriato.
    P.P.S: se vuoi aiutare gli utenti a leggere il codice che hai postato, usa i tag CODE, come indicato nel regolamento interno (punto 6).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    per Mauro:
    Sai cos'è una chiamata ricorsiva?
    I got the remedy

  5. #5
    Originariamente inviato da albgen
    per Mauro:
    Sai cos'è una chiamata ricorsiva?
    Si si...
    Non è che non so a cosa serva il mergesort, il mio problema è scriverlo...
    Se magari mi date una mano per esempio qualche punto di partenza ve ne sarei grato

  6. #6

    Re: Moderazione

    Originariamente inviato da alka
    Poni una domanda specifica.

    Qui si da una mano a scrivere il codice, ma spiegare per filo e per segno un listato preso chissà dove non è proprio l'obiettivo del forum.

    P.S.: sposto la discussione nel forum appropriato.
    Era un semplice esempio...
    Infatti ora sono incasinato perchè dovrei scriverlo io e non so da dove cominciare.
    Da quel che ho capito ho un vettore, lo divido in sottovettori fino a lunghezza minima. Poi ordino all' interno i numeri presenti e ricompongo l' intero vettore...
    Chiaritemi le idee please :master:

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Originariamente inviato da MauroCutrona
    Non è che non so a cosa serva il mergesort, il mio problema è scriverlo...
    Se magari mi date una mano per esempio qualche punto di partenza ve ne sarei grato
    Ripeto, non è chiaro qual è il problema.

    O meglio, se si tratta di scriverlo interamente, allora quest'area non è quella corretta, perché qui non si demanda a terzi la scrittura di codice su commissione, in forma gratuita o retribuita.

    Se invece si tratta di "dare una mano", allora tu inizi, e quando ti blocchi o hai un problema, spieghi qual è e cerchiamo appunto di aiutarti.

    Se per darti una mano si deve fare qualcosa al posto tuo, allora il tuo concetto di "dare una mano" è diverso da quello che intendo io.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Originariamente inviato da alka
    Ripeto, non è chiaro qual è il problema.

    O meglio, se si tratta di scriverlo interamente, allora quest'area non è quella corretta, perché qui non si demanda a terzi la scrittura di codice su commissione, in forma gratuita o retribuita.

    Se invece si tratta di "dare una mano", allora tu inizi, e quando ti blocchi o hai un problema, spieghi qual è e cerchiamo appunto di aiutarti.

    Se per darti una mano si deve fare qualcosa al posto tuo, allora il tuo concetto di "dare una mano" è diverso da quello che intendo io.
    Nada, non voglio nulla che sia fatto al posto mio, altrimenti non starei qui a scrivere il problema non trovi?
    Comunque ora porvo a cominciare a ragionare un pò su come posso fare, come ho difficoltà avviso

  9. #9
    Primo dubbio, se ho un vettore di dim = 4 si scompone in 2 sottovettori di dim = 2. E fin qua ci sono. Ma se il vettore fosse di dim= 12 per esempio?
    si scompone in 2 sottovettori di dim = 6
    poi in altri 4 sottovettori di dim = 3 e mi devo fermare qui e analizzarli tutti e 4 per poi ricomporli giusto??
    E se ne avessi uno di dim = 13 come dovrei procedere?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.