l& h对应于1st&的指数。数组a中的最后一个元素: - 各个分区和合并功能运行良好。请解释两个功能的链接中发生的错误。
#include <stdio.h>
void mergesort(int a[], int l, int h);
void merge (int a[], int l, int m, int h);
int main ()
{
int a[] = {5,4,9,0,8,6,1,3,2,7}, i;
mergesort (a, 0, 5);
for (i = 0; i < 10; i++)
printf ("%d ", a[i]);
return 0;
}
void mergesort(int a[], int l, int h)
{
if (l == h)
return;
int m = (l + h) / 2;
mergesort (a, l, m);
mergesort (a, m + 1, h);
merge(a, l, m, h);
}
void merge (int a[], int l, int m, int h)
{
int t[h - l + 1], i = l, j = m + 1, k = 0;
while (i <= m && j <= h) {
if (a[i] < a[j]){
t[k] = a[i];
k++;
i++;
}
if (a[j] < a[i]) {
t[k] = a[j];
j++;
k++;
}
}
if (i != m) {
while (i <= m) {
t[k] = a[i];
k++;
i++;
}
}
if (j != h) {
while (j <= h) {
t[k] = a[j];
k++;
j++;
}
}
for (i = 0; i <= (h - l); i++)
a[l + i] = t[i];
}
而不是所需的输出
0 4 5 6 8 9 1 3 2 7
(元素0到5包含变为排序),它会产生一些像
这样的垃圾0 4 6 9 2686712 32 1 3 2 7
答案 0 :(得分:1)
行if (i != m)
和if (j != h)
必须为if (i <= m)
和if (j <= h)
。
此外,您也可以省略它们,因为它们是多余的(仅保留while
条件)。
更少的代码,更少的错误。