2016-03-28 1 views
1

Я пытаюсь написать сортировку слияния, используя итераторы, чтобы научить себя C++, но по какой-то причине этот код компилируется, но результат не сортируется. Может ли кто-нибудь выяснить, что с ним не так? это кажется совершенно прекрасным для моих неподготовленных глаз.что не так с этим кодом сортировки слияния?

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; 
} 

ответ

2

неверный код vec = temp, который заменит вектор происхождения вектора темпа в некотором шаге слияния. Потому что, каждый аранжировка, темп только от низкого до высокого вектора происхождения.
Тогда вектор начала становится суб-вектором.

Вы можете вернуть новый вектор каждый раз, или сделать это in place

Пример кода, изменение аранжировать функции:

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

Спасибо! это имеет гораздо больше смысла! –