マージソートを実装する必要がある次の 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");
}