c++ 冒泡排序代码的问题可能出在哪里?

1zmg4dgp  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(106)

我遇到了问题,代码对“tab”进行了很好的排序,返回了正确的结果,但是“tab2”已经返回了错误的结果(7 6 4 0 4 1 3 1 5 6 7 8 9)。不幸的是,我没有在代码中看到任何错误,在我看来一切都是正确的

#include <iostream>

void sort(int* begin, int* end) {
    for (int* i = begin; i != end; ++i) {
        //std::cout << *i<< std::endl;

        for (int* j = i+1 ; j < end ; ++j) {
            //std::cout << *(j - 1)<<" " << *j << std::endl;
            if (*(j - 1) > *j) {
                std::swap(*(j - 1), *j);
            }
        }
    }
}

void write(int* begin, int size)
{
    while (size > 0)
    {
        std::cout << *begin << ' ';
        ++begin;
        --size;
    }
}

int main()
{
    int tab[10] = { 0, 9, 1, 3, 8, 2, 6, 7, 5, 4 };
    sort(tab, tab + 10);
    write(tab, 10);

    std::cout << '\n';

    int tab2[16] = { 9, 7, 8, 6, 5, 4, 4, 0, 9, 6, 7, 1, 6, 3, 1, -100 };
    sort(tab2, tab2 + 15);
    write(tab2, 15);
}
cwtwac6a

cwtwac6a1#

你有两个循环,并且在比较和交换时只使用内层循环的索引,而经典的冒泡排序使用两个索引,外层索引的元素得到它后面的最大值。
因此,解决办法是:

if (*i > *j) {
                std::swap(*i, *j);
            }

或者,问题可能是内部循环的开始在最小值到达底部之前向前移动。如果在每次迭代之后打印列表,您可以清楚地看到这一点。在这种情况下,修复方法是不在外部循环的光标处开始内部循环,而是在第一个元素之后开始内部循环。

for (int* i = begin; i <= end; ++i) {
        for (int* j = begin+1 ; j <= end ; ++j) {
            if (*(j - 1) > *j) {
                std::swap(*(j - 1), *j);

相关问题