Γιατί Συγχώνευση Συγχώνευση () συνάρτηση Ταξινόμηση έχουν μια υπό όρους δεύτερο loop;

ψήφοι
1
merge1(int low, int high, int S[], U[]) 
{ 
    int k = (high - low + 1)/2
    for q (from low to high) U[q] = S[q]
    int j = low 
    int p = low 
    int i = low + k 

    while (j <= low + k - 1) and (i <= high) do 
    { 
        if ( U[j] <= U[i] ) 
        {
            S[p] := U[j] 
            j := j+1
        } 
        else 
        { 
            S[p] := U[i] 
            i := i+1 
        } 
        p := p+1 
    } 

    if (j <= low + k - 1) 
    { 
        for q from p to high do 
        { 
            S[q] := U[j] 
            j := j+1 
        } 
    }
}


merge_sort1(int low, int high, int S[], U[]) 
{ 
    if low < high 
    { 
        int k := (high - low + 1)/2 
        merge_sort1(low, low+k-1, S, U) 
        merge_sort1(low+k, high, S, U) 
        merge1(low, high, S, U) 
    } 
}

Έτσι, βασικά, αυτό είναι για σημειώσεις διάλεξης μου. Θεωρώ ότι είναι αρκετά συγκεχυμένη σε γενικές γραμμές, αλλά καταλαβαίνω το μεγαλύτερο μέρος της. Αυτό που δεν καταλαβαίνω είναι η ανάγκη του «αν (ι <= χαμηλή + k - 1)» μέρος. Φαίνεται σαν να ελέγχει αν υπάρχουν στοιχεία που «έφυγε» στο αριστερό τμήμα. Είναι ότι ακόμη δυνατό όταν mergesorting;

Δημοσιεύθηκε 24/04/2010 στις 00:28
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
2

Κατά τη συγχώνευση δύο ταξινομημένων λιστών (ας τους αποκαλούν leftκαι right), θα συνεχίσετε να παίρνετε ένα στοιχείο και να προστεθεί στη resultλίστα, μέχρι να τελειώσουν τα στοιχεία είτε στο leftή rightλίστα. Αυτό γίνεται από το πρώτο whileloop. Τώρα θα πρέπει να προσθέσετε τα στοιχεία που παραμένουν στην αριστερή ή τη δεξιά λίστα στη λίστα αποτέλεσμα. Υπάρχουν δύο επιλογές:

  • Η αριστερή λίστα είναι εκτός των στοιχείων, καθώς και το δικαίωμα κατάλογος εξακολουθεί να έχει κάποια. Ο τρόπος που ο κωδικός είναι γραμμένο εδώ, δεν χρειάζεται να κάνετε τίποτα, από το τέλος του Sπίνακα περιέχει ήδη τα τελευταία στοιχεία της rightλίστας.

  • Το δικαίωμα κατάλογος είναι έξω από τα στοιχεία, και το αριστερό λίστας εξακολουθεί να έχει κάποια. Στη συνέχεια, αντιγράψτε τα υπόλοιπα στοιχεία στο τέλος του S. Αυτό είναι ό, τι το ifστο τέλος του merge1κάνει.


Όσον αφορά την ερώτησή σας, αν αυτός ο κωδικός είναι «κακό»: Ο κωδικός είναι σωστός, αλλά θα ήθελα να κάνω κάποιες αλλαγές για να γίνει πιο ευανάγνωστο:

  • Περιγραφικά ονόματα των μεταβλητών.
  • Περνώντας το μέσο το οποίο διαχωρίζει τα leftκαι rightλίστες για merge1αντί να την έχουν υπολογιστεί εκ νέου.
Απαντήθηκε 24/04/2010 στις 00:45
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more