Функция слияния для сортировки слиянием - PullRequest
0 голосов
/ 27 октября 2018

У меня трудное время с частью слияния для сортировки слиянием. Каждый раз, когда я объединяю две половины вектора, он теряет хотя бы одно из значений в векторе.

void merge(vector <double> &v, vector <double> &temp, int start, int size) {
int i, j, k;


i = start;
j = start + size - size/2;
k = start;

temp.resize(v.size());
while(i < start+size/2 && j < start+size) {
    if(v[i] <= v[j]) {
        temp[k] = v[i];
        i++;
        k++;
    //  cout << "i <= j " << temp[k] << endl;
    } else {
        temp[k] = v[j];
        j++;
        k++;
    //  cout << "i > j "<< temp[k] << endl;
    }
}

for(i = start; i < start+size; i++) {
    v[i] = temp[i];
}

}

1 Ответ

0 голосов
/ 27 октября 2018

Так как я не знаю реализацию вызывающей стороны и могу ошибаться, но я думаю, что есть две ошибки.

  • Во-первых, i заканчивается на start+size/2 в первом цикле while. Это значение должно быть равно первому значению j, равному start+size-size/2. Но, например, если size==5, то start+5/2=start+2 и start+5-5/2=start+3. В этом случае v[start+2] никогда не вводится в конечный результат.

  • Во-вторых, после выхода из первого цикла while оставшиеся значения v также должны быть присвоены temp.

Итак, мой быстрый ответ следующий. Демо-версия здесь .

void merge(std::vector<double> &v, std::vector<double> &temp, int start, int size) 
{
    int i = start;             // left  array begin
    int j = i + size - size/2; // right array begin (which should be guaranteed by caller.)

    int i_max = j;             // left  array end
    int j_max = start+size;    // right array end

    int k = i;
    temp.resize(v.size());

    while(i < i_max && j < j_max) 
    {
        if(v[i] <= v[j]){
            temp[k] = v[i];
            i++;
            k++;
            //std::cout << "i <= j: " << temp[k-1] << std::endl;
        } 
        else {
            temp[k] = v[j];
            j++;
            k++;
            //std::cout << "i >  j: "<< temp[k-1] << std::endl;
        }
    }

    while (i < i_max) { 
        temp[k] = v[i]; 
        i++; 
        k++; 
    } 

    while (j < j_max) { 
        temp[k] = v[j]; 
        j++; 
        k++; 
    } 

    for(i = start; i < j_max; i++) {
        v[i] = temp[i];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...