C++ 冒泡排序和比较

4
我写了一些代码来尝试通过年份、名称或投票数对我的电影列表进行排序,但是当我运行应用程序时它并没有排序。我想知道我哪里出错了。我认为这可能与电影的Movie有关。
更新:我已经部分修复了它,现在它可以对列表中的前10或20个项目进行排序,但无法对其余项目进行排序。我使用cout检查了我的循环是否有问题,似乎从0到248都没问题。
enum MovieSortOrder
{
    BY_YEAR = 0,
    BY_NAME = 1,
    BY_VOTES = 2
};

int Movie::CompareByVotes(Movie m) {
    if (m.get_votes() == this->get_votes()) {
        return 0;
    } else if (m.get_votes() > this->get_votes()) {
        return 1;
    } else {
        return -1;
    }
}

int Movie::CompareByYear(Movie m) {
    if (m.get_year() == this->get_year()) {
        return 0;
    } else if (m.get_year() > this->get_year()) {
        return 1;
    } else {
        return -1;
    }
}

int Movie::CompareByName(Movie m) {
    string a = m.get_name();
    string b = this->get_name();
    if (a[0] = b[0]) {
        return 0;
    } else if (a[0] > b[0]) {
        return 1;
    } else if (a[0] < b[0]) {
        return -1;
    }
}

int Movie::CompareTo(Movie m, MovieSortOrder n) {
    if (n == 0) {
        return CompareByYear(m);
    } else if (n == 1) {
        return CompareByName(m);
    } else if (n == 2) {
        return CompareByVotes(m);
    }
}



bool MovieList::MoveLargestToEnd(MovieSortOrder n) {
    bool changed = false;
    for (int i = 0; i < last_movie_index; i++) {
        //cout << i << endl;
        if (movies->CompareTo(movies[i], n) > movies->CompareTo(movies[i + 1], n)) {
            swap(movies[i], movies[i + 1]);
            changed = true;
        }
    }
    return changed;
}

void MovieList::BubbleSort(MovieSortOrder n) {
    for (int i = 0; i < last_movie_index; i++) {
        if (!MoveLargestToEnd(n)) {
            return;
        }
    }
}
2个回答

2

这一行存在问题:

 if (a[0] = b[0])

它执行的是赋值操作,而非比较操作。其true/false结果取决于b[0]的值。

这是Movie::CompareByName(Movie m)中的第一个if语句。


哦,谢谢。我已经在这上面工作了一整天,所以我的大脑有点烧坏了。问题是我的列表根本就不排序。无论我调用按年份、名称或投票数排序,它都没有任何反应。 - andayn

0

你可能在这里访问了一个越界的索引i

for (int i = 0; i < last_movie_index; i++)
{
    if (movie.CompareTo(movies[i], n) > movie.CompareTo(movies[i + 1], n))
    {
        swap(movies[i], movies[i + 1]);
        changed = true;
    }
}

此外,MovieList::BubbleSort 可以简化为以下代码:

void MovieList::BubbleSort(MovieSortOrder n)
{
    while (MoveLargestToEnd(n));
}

你代码中更有问题的部分:

    if (movie.CompareTo(movies[i], n) > movie.CompareTo(movies[i + 1], n))

鉴于您实现了这些比较函数,您上面的用法是不正确的。您正在创建一个空的Movie movie;变量,并将其与您的movies[i]进行比较。这就是为什么您的排序不起作用的主要原因。您真正想要的是比较movies列表中相邻的项目。类似这样的东西:
    if (movies[i].CompareTo(movies[i + 1], n) == -1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接