string words[N];
int res[N];
Это не является допустимым C ++, вы не можете определить размер стекового массива, используя переменную времени выполнения, хотя некоторые компиляторы могут поддерживать такую функцию. Вместо этого вы можете использовать, скажем, std::vector
, который ведет себя подобно массиву.
vector<string> words;
vector<int> res;
for (int i = 0; i < N; i++) {
int sum = 0;
int value = 0;
int temp = 0;
string word;
cin >> word;
words.push_back(word);
for (int j = 0; j < word.length(); j++) {
sum += (int)word[j] - 64;
}
value = sum / word.length();
res.push_back(value);
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (res[i] < res[j]) {
swap(res[i], res[j]);
swap(words[i], words[j]);
}
}
}
Порядок следования из-за нестабильности вашего алгоритма сортировки. Стабильный означает, что элементы с одинаковыми значениями будут поддерживать одинаковый порядок относительно друг друга.
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (res[i] < res[j]) {
swap(res[i], res[j]);
swap(words[i], words[j]);
}
}
}
То, что у вас есть, очень близко к пузырьковой сортировке, которая стабильна.
for (int i = 0; i < N; i++) {
for (int j = 0; j < N - i - 1; j++) { // i elements sorted so far
if (res[j] > res[j + 1]) {
swap(res[j], res[j + 1]);
swap(words[j], words[j + 1]);
}
}
}
C ++также обеспечивает стабильную сортировку в <algorithm>
, но она не может функционировать напрямую в двух массивах, как это, к сожалению, один вариант - вычислить значение на лету, другой - создать класс, содержащий оба элемента, и отсортировать его, илидругой для сортировки индексов.
std::stable_sort(words.begin(), words.end(), [&](auto &a, auto &b)
{
int suma = 0, sumb = 0; // better yet, make a "int value(const string &str)" function.
for (int j = 0; j < a.length(); j++) {
suma += (int)a[j] - 64;
}
for (int j = 0; j < b.length(); j++) {
sumb += (int)b[j] - 64;
}
int valuea = suma / a.length();
int valueb = sumb / b.length();
return valuea < valueb;
});
Класс, содержащий оба элемента, довольно прост, для индексов создайте 3-й массив и отсортируйте его.
vector<size_t> indices;
...
string word;
cin >> word;
indices.push_back(words.size());
words.push_back(word);
...
std::stable_sort(indices.begin(), indices.end(), [&](auto a, auto b){ return res[a] < res[n]; });
for (int i = 0; i < N; i++) {
cout << words[indices[i]] << endl;
}