外壳排序将数组的元素替换为 -858993460

Shell Sort replaces element of array with -858993460

本文关键字:替换 -858993460 元素 排序 数组 外壳      更新时间:2023-10-16

好的,所以我目前正在为我目前采用的数据结构和算法编写一个 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]);