2016-03-28 26 views
1

Kendimi C++ öğretmek için yineleyiciler kullanarak birleştirme sıralama yazmaya çalışıyorum, ancak bir nedenle bu kod derleniyor ama sonuç sıralanmaz. Birisi neyin yanlış olduğunu anlayabilir mi? eğitimsiz gözlerime mükemmel görünüyor.Bu birleştirme sıralama koduyla ilgili sorun nedir?

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

cevap

2

yanlış kod birleştirme bazı aşamasında geçici bir vektör tarafından vektörün yerini alacak vec = temp vardır. Çünkü, her düzenleme, temp sadece kökeni vektöründen düşüktür.
Daha sonra kök vektörü bir alt vektör haline gelir.

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

teşekkür:

İşlevin düzenlemek yeni bir vektör her zaman dönmek veya bunu in place

Örnek kod yapın değiştirebilirsiniz! Bu çok daha mantıklı! –

İlgili konular