2016-03-28 12 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

感謝を!これははるかに理にかなっています! –

関連する問題