У меня есть следующий код C ++, с которым мне нужно реализовать сортировку слиянием. Это частично работает, но выполняет бесконечный цикл без сортировки по какой-то причине, которую я не могу определить. Он также выводит 0,00 для части значений вместо начальных значений. (например, входные значения 9,12 1,59 выводит 1,59 0,00) Но когда у меня более 2 элементов, это когда это бесконечный цикл и не выполняется сортировка. Дополнительные функции printf () необходимы для правильности моего назначения, поэтому вы можете игнорировать их для анализа. Заранее благодарю за любую помощь!!
double max(double x, double y)
{
return (x > y) ? x : y;
}
void sort_doubles(vector <double> &v, int print)
{
int i;
vector<double> tmp;
tmp.resize(v.size());
recursive_sort(v, tmp, 0, v.size(), print);
printf("%16c",' ');
for (i = 0; i < v.size(); i++) printf(" %.2lf",v.at(i));
printf("\n");
}
void recursive_sort(vector<double> &v, vector<double> &temp, int start, int size, int print)
{
int i,mid,left,right;
double j;
if (size == 1) return;
i = 0;
mid = start + (size/2);
left = start;
right = start + mid;
printf("B: %5d %5d ",start, size);
for (i = 0; i < v.size(); i++) printf(" %.2lf", v.at(i));
printf("\n");
recursive_sort(v, temp, left, mid, print);
recursive_sort(v, temp, left+mid, size-mid, print);
for(i = 0; i < size; i++)
{
/* Check to see if any elements remain in the left array; if so,
* we check if there are any elements left in the right array; if
* so, we compare them. Otherwise, we know that the merge must
* use take the element from the left array */
if(left < start + mid && (right == start+size || max(v[left], v[right]) == v[left]))
{
temp[i] = v[right];
right++;
}
else
{
temp[i] = v[left];
left++;
}
}
/* Copy the sorted subarray back to the input */
for(i = start; i < start+size; i++)
{
v[i] = temp[i];
}
printf("E: %5d %5d ",start,size,' ');
for (i = 0; i < v.size(); i++) printf(" %.2lf",v.at(i));
printf("\n");
}
Наконец-то понял! ниже приведен код на тот случай, если он кому-то может понадобиться.
double min(double x, double y)
{
return (x < y) ? x : y;
}
void sort_doubles(vector <double> &v, int print)
{
int i;
vector<double> tmp;
tmp.resize(v.size());
recursive_sort(v, tmp, 0, v.size(), print);
printf("%16c",' ');
for (i = 0; i < v.size(); i++) printf(" %.2lf",v.at(i));
printf("\n");
}
void recursive_sort(vector<double> &v, vector<double> &temp, int start, int size, int print)
{
int i,mid,left,right;
double j;
if (size == 1) return;
i = 0;
mid = size/2;
left = start;
right = left+mid;
printf("B: %5d %5d ",start, size);
for (i = 0; i < v.size(); i++) printf(" %.2lf", v.at(i));
printf("\n");
recursive_sort(v, temp, left, mid, print);
recursive_sort(v, temp, left+mid, size-mid, print);
for(i = 0; i < size; i++)
{
/*
* Check to see if any elements remain in the left array; if so,
* we check if there are any elements left in the right array; if
* so, compare them. Otherwise, we know that the merge must
* use take the element from the left array
*/
if(left < (start + mid) && (right == start+size || min(v.at(left), v.at(right)) == v.at(left)))
{
temp.at(i) = v.at(left);
left++;
}
else
{
temp.at(i) = v.at(right);
right++;
}
}
//Copy the sorted subarray back to the input
for(i = start; i < start+size; i++)
{
v.at(i) = temp.at(i-start);
}
printf("E: %5d %5d ",start,size,' ');
for (i = 0; i < v.size(); i++) printf(" %.2lf",v.at(i));
printf("\n");
}
Других решений пока нет …