我正在编写一个应该使用合并排序对数组进行排序的函数。到目前为止,我有两个功能:
template <typename Item, typename SizeType>
void merge_sort(Item data[], SizeType size) {
SizeType size1, size2;
if(size > 1) {
size1 = size/2;
size2 = size - size1;
merge_sort(data,size1);
merge_sort((data+size1),size2);
merge(data,size1,size2);
}
}
和
template <typename Item, typename SizeType>
void merge(Item data[], SizeType size1, SizeType size2) {
Item* temp;
SizeType copied = 0;
SizeType copied1 = 0;
SizeType copied2 = 0;
temp = new Item[size1 + size2];
while(copied1 < size1 && copied2 < size2) {
if(data[copied1] < (data + size1)[copied2])
temp[++copied] = data[++copied1];
else
temp[++copied] = (data + size1)[++copied2];
}
while (copied1 < size1)
temp[++copied] = data[++copied1];
while (copied2 < size2)
temp[++copied] = (data + size1)[++copied2];
for(SizeType i = 0; i < size1 + size2; ++i)
data[i] = temp[i];
delete [] temp;
}
当我尝试运行该程序时,我收到一个调试错误,说明在正常块之后堆已损坏并且CRT检测到应用程序在堆缓冲区结束后写入内存。任何人都可以解释这意味着什么以及如何解决它?
答案 0 :(得分:2)
在使用值之前你正在递增...所以这基本上使得检查过时了......
改为使用copied++
。
你需要后增量运算符,因为如果你在使用它之前递增它,你就会超出范围。 的 Increment and decrement operators 强>
答案 1 :(得分:2)
你的意思是你的增量是后增量而不是预增量吗?例如:
temp[copied++] = (data + size1)[copied2++];
预先增加,在第一次迭代时,当copied2
为0
时,您正在访问(data + size1)[1]
。当copied2
到达已分配内存的末尾时,您将在结束时访问一个内存。
为避免这种情况,我建议不要将增量作为子表达式。写和来阅读可能会令人困惑。
答案 2 :(得分:1)
如果复制= 0且复制1 = 0则行
temp [++ copied] = data [++ copied1];
将产生
temp [1] = data [1];
因为前缀++在此处具有最高优先级