あなたのアプローチにはさまざまなレベルの問題がいくつかあります。
問題 #1、i+1 は PlayList.size() を超える可能性があります。
for ( ... i < storedRelevance.size() ... )
if(storedRelevance[i+1]>storedRelevance[i]){
m と i の条件が間違っていると思います。
問題#2、1つの場所から両方の値をコピーしてから、それらの1つだけを「パーク」する必要がある場合に、それらを別の場所にコピーします。
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を調べてください