2014-12-06 87 views
4

我已經做了一些代碼,嘗試按年份,名稱或投票排序我的電影列表,但是當我運行該應用程序時,它沒有排序。只是想知道我哪裏錯了。我相信這可能與電影電影有關。C++氣泡排序和比較

更新:我已經有些固定它,現在它是排序列表中的前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

這條線是一個問題:

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

它做分配,不進行比較。其真/假來自b[0]的值。

也就是說在Movie::CompareByName(Movie m)

+0

噢,謝謝。我一整天都在做這個,所以我的大腦有點油炸。問題是我的清單只是不排序。無論我按照年份,名稱還是選票進行排序,都不會發生任何事情。 – andayn 2014-12-06 03:47:01

0

第一if你可能訪問的約束外的指數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)