У меня возникли трудности с частью слияния для сортировки слияния. Каждый раз, когда я объединяю две половины вектора, он теряет по крайней мере одно из значений в векторе.
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];
}
}
Поскольку я не знаю реализации вызывающего абонента и могу ошибаться, но я думаю, что есть две ошибки.
Сначала 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];
}
}
Ваш цикл может завершиться при любом из двух условий. Вы должны скопировать левые элементы из одного из массивов, если они есть, пока второе условие не станет ложным. В настоящее время, если одна часть состоит из 21 элемента, а другая - из 22, вы объединяете только 42 элемента.