外壳排序将数组的元素替换为 -858993460
Shell Sort replaces element of array with -858993460
好的,所以我目前正在为我目前采用的数据结构和算法编写一个 shell 排序函数。我们得到了算法本身,但要求在C++中为模板化类型编写它。在写出我认为正确的内容后,排序在 7 次迭代后出错,并用 -858993460 替换我排序中最高的数字。
template <class T>
void shellSort(T list [], int size)
{
int gap = size / 2;
while (gap > 0)
{
for (size_t i = 0; i < size - gap; i++)
{
if (list[i] > list[i + gap])
{
swap(list, list[i], list[i + gap]);
}
for (int j = 0; j < size; j++)
{
cout << list[j] << " ";
}
cout << endl;
}
gap /= 2;
}
bubbleSort(list, size);
}
在运行 Shell 排序之前,我将数组的值重置为随机分类,只是为了测试其他排序,使用
void resetArray(int list [])
{
list[0] = 5;
list[1] = 2;
list[2] = 7;
list[3] = 2;
list[4] = 3;
list[5] = 4;
list[6] = 1;
cout << "List Reset. List is Now: ";
for (size_t i = 0; i < 6; i++)
{
cout << list[i] << " ";
}
cout << endl;
}
我的排序输出去
5 2 4 2 3 7 1
5 2 4 2 3 7 1
5 2 4 2 3 7 1
5 4 2 2 3 7 1
5 4 2 2 7 3 1
5 4 -858993460 2 2 3 1
5 4 -858993460 2 2 3 1
没有看到你的swap
,我说罪魁祸首是这句话:
swap(list, list[i], list[i + gap]);
您正在传递位置 2 和 3 中的值,几乎可以肯定需要索引。此调用应如下所示:
swap(list, i, i + gap);
否则,swap
会将数组的值解释为要交换的索引,从而读取数组外部的内存。
为避免将来出现此类问题,请改用std::swap
:
std::swap(list[i], list[i + gap]);
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 如何用转义符替换字符串中的所有特殊字符
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 在一个读写器队列中,我可以用volatile替换原子吗
- 用符号版本替换对函数的所有调用
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 替换基于地图的所有引用
- 按平均值替换数组中的元素
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 初始化 std::vector 替换为单大括号而不是双大括号
- 删除/替换C++字符串中的多字符 (ÿû)
- 将 malloc 替换为数组
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 如何在C++中用'\'替换''来处理转义序列?
- 替换密码:哪一个?
- 替换 C++17 中移除的绑定 1st
- 将 Boost MPL 容器替换为 C++17 功能
- C++:如何用单个命令替换复杂的迭代?
- 外壳排序将数组的元素替换为 -858993460