【发布时间】:2014-01-13 10:43:34
【问题描述】:
我有以下代码
void mergesort(int size, int ar[], int temp[])
{
if(size <=1)
{
return;}
else
{
int i = 0;
int mid = size/2;
int *left = &ar[0];
int *right = &ar[mid];
int *rend = &ar[size];
int *lend = right;
mergesort(mid,left,temp);
mergesort(size-mid,right,temp);
for(i=0; i<size;i++)
{
if(left < lend && (*left < *right || right >= rend))
{
temp[i] = *left++;
}
else
{
temp[i] = *right++;
}
}
for(i = 0; i < size; i++)
{
ar[i] = temp[i];
}
}
}
我不明白这个 if 语句是如何工作的:
if(left < lend && (*left < *right || right >= rend))
{
temp[i] = *left++;
}
else
{
temp[i] = *right++;
}
你能告诉我那里发生了什么吗?为什么我们必须比较地址? (左 = 撕裂)
这是从 main 调用 mergesort 函数的方式
const int SIZE = 8;
int array[SIZE] = {3,6,1,-9,0,2,4,5};
int temp[SIZE];
mergesort(SIZE, array,temp);
【问题讨论】:
-
因为数组存储为顺序内存地址?
-
考虑如果你不这样做会发生什么。什么会阻止读取(子)数组的末端?
-
也就是说,这段代码对我来说看起来很糟糕。如果
right到达数组的末尾,那么它仍然会在*left < *right中被取消引用,这会调用未定义的行为。 -
@OliCharlesworth 是的,应该是 (right >= rend || *left
-
@AbhishekBansal:只有在
left == lend时不检查;)
标签: c++ algorithm recursion mergesort divide-and-conquer