2016-03-28 5 views
1

Ich versuche, Merge-Sortierung mit Iteratoren zu schreiben, um mich selbst C++ beizubringen, aber aus irgendeinem Grund kompiliert dieser Code, aber das Ergebnis ist nicht sortiert. Kann jemand herausfinden, was damit nicht stimmt? es scheint meinen ungeübten Augen völlig in Ordnung zu sein.Was ist falsch an dieser Zusammenführungs-Sort-Code?

typedef vector<int> vec_int; 
typedef vector<int>::iterator vec_int_iter; 

void merge_sort(vec_int& vec, vec_int_iter low, vec_int_iter high){ 
    if(low < high){ 
     vec_int_iter med = low + (high-low)/2 ; 
     merge_sort(vec, low, med); 
     merge_sort(vec, med+1, high); 
     arrange(vec, low, med, high); 
     } 
} 

void arrange(vec_int& vec, vec_int_iter low, vec_int_iter med, vec_int_iter high){ 
    vec_int_iter left = low, right = med+1; 
    vec_int temp; 
    temp.clear(); 
    vec_int_iter it = temp.begin(); 

    while(left <= med and right <= high) 
     temp.push_back((*left < *right)? *left++ : *right++); 
    while(left <= med) 
     temp.push_back(*left++); 
    while(right <= high) 
     temp.push_back(*right++); 

    vec = temp; 
} 

Antwort

2

der falsche Code ist vec = temp, die den Ursprungsvektor durch einen Vektor in einem gewissen Temperatur Schritt der Zusammenführung ersetzt. Weil, jede Anordnung, die Temperatur nur von niedrig zu hoch des Ursprungsvektors ist.
Dann wird der Ursprungsvektor ein Untervektor.

Sie können einen neuen Vektor jedes Mal, zurückzukehren, oder tun es in place

Beispielcode, die Funktion anordnen ändern:

void arrange(vec_int& vec, vec_int_iter low, vec_int_iter med, vec_int_iter high){ 
    vec_int_iter left = low, right = med+1; 
    vec_int temp; 
    temp.clear(); 
    while(left <= med and right <= high) 
     temp.push_back((*left < *right)? *left++ : *right++); 
    while(left <= med) 
     temp.push_back(*left++); 
    while(right <= high) 
     temp.push_back(*right++); 

    vec_int_iter start = low; 
    for(vec_int_iter t = temp.begin(); t <temp.end(); t++){ 
     *start++ = *t; 
    } 
    } 
+0

Dank! das macht viel mehr Sinn! –