【问题标题】:C++ Bubble Sorting and ComparingC++ 冒泡排序和比较
【发布时间】:2023-03-20 16:45:02
【问题描述】:

我已经编写了一些代码来尝试按年份、名称或票数对我的电影列表进行排序,但是当我运行应用程序时它没有排序。只是想知道我哪里出错了。我相信这可能与电影有关。

更新:我已对其进行了一些修复,现在它正在对列表中的前 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;
        }
    }
}

【问题讨论】:

    标签: c++ sorting bubble-sort


    【解决方案1】:

    您很可能在此处访问超出范围的索引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; 变量,并将 that 与您的 movies[i] 进行比较。这是你的排序不起作用的一个重要原因。您真正想要的是比较movies 列表中的相邻项目。比如:

        if (movies[i].CompareTo(movies[i + 1], n) == -1)
    

    【讨论】:

      【解决方案2】:

      这一行有问题:

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

      它是赋值,而不是比较。它的真/假来自b[0]的值。

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

      【讨论】:

      • 哦,谢谢。我整天都在做这个,所以我的大脑有点炸了。问题是我的列表没有排序。无论我按年份、姓名或选票进行排序,它都没有发生任何事情。
      猜你喜欢
      • 1970-01-01
      • 2016-02-06
      • 2018-10-01
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 2012-08-26
      相关资源
      最近更新 更多