你的方法有几个不同层次的问题。
问题 #1,i+1 可能超过 PlayList.size()。
for ( ... i < storedRelevance.size() ... )
if(storedRelevance[i+1]>storedRelevance[i]){
我认为你有你的条件 m 和 i 循环错误的方式。
问题#2,你从一个地方复制两个值,然后将它们复制回其他地方,当你只需要“停放”其中一个时:
floatTemp1 = storedRelevance[i];
floatTemp2 = storedRelevance[i+1];
storedRelevance[i]= floatTemp2;
storedRelevance[i+1] = floatTemp1;
更好的
floatTemp = storedRelevance[i];
storedRelevance[i] = storedRelevance[i+1];
storedRelevance[i+1] = floatTemp;
或者更好
std::swap(storedRelevance[i], storedRelevance[i+1]);
但同样, i+1 可能超过 PlayList.size() 与您当前的实现。
大问题:
stringTemp1 = relevantPlays[i];
stringTemp2 = relevantPlays[i+2];
+2 似乎......错误的字符串,肯定会超过数组大小。
relevantPlays[i]= stringTemp2;
relevantPlays[i+1]= stringTemp1;
除了确保排序总是花费 O(N^2) 复杂性之外,我也不了解外部“m”循环的目的?
如果您只是将其作为练习来了解如何实现排序,则可能需要查看以下替代方法之一:
方法 1:使用结构/类来赋予值局部性(这是C++)
struct PlayListSearchResult {
int m_relevance;
const string& m_word; // a reference, so a short lifetime for these objects.
PlayListSearchResult(int relevance_, const std::string& word_)
: m_relevance(relevance_)
, m_word(word_)
{}
};
typedef std::vector<PlayListSearchResult> PlayListSearchResults;
// the sort:
// given PlayListSearchResults results or &results:
const numResults = results.size();
bool needsRedo;
do {
needsRedo = false;
for (size_t i = 0; i < numResults - 1; ++i) {
if (!(results[i + 1].m_relevance < results[i].m_relevance))
continue;
std::swap(results[i], results[i + 1]);
needsRedo = true;
}
} while (needsRedo);
方法2:创建索引数组:
std::vector<size_t> indexes;
for (size_t i = 0; i < results.size(); ++i) {
indexes.push_back(i);
}
// do the sort, but instead of swapping relevance/word, just swap the index.
但除此之外,只需查看std::sort或std::map