Как отсортировать несколько массивов по одному и распечатать их - PullRequest
0 голосов
/ 22 сентября 2019

Я использовал строковый поток для чтения входного файла с 10 строками и сохранил все значения в отдельных массивах.ID, первый, последний, город, штат и средний балл.Выглядело это так.

1 Натан Хамфери Канзас МО 3.35
2 Сара Джонатан ЛисСаммит МО 3.56
3 Кайла Джеймс Либерти КС 3.78
4 Кайл Дэвис Индепенденс КС 2.98
...
8 Даниэль Эрла Независимость KS 3.77

Таким образом, массив идентификаторов будет {1, 2, 3, 4, ..., 8}
имассив города будет {Канзас, LeesSummit, Свобода, Независимость, ..., Независимость}

Одна из функций в моей программе должна распечатывать информацию, отсортированную по городам.

Я использовал алгоритм сортировки выбора, чтобы отсортировать массив городов, чтобы расположить их в правильном алфавитном порядке.Но теперь я не уверен, как правильно отсортировать другие массивы в соответствии с информацией, которая была в массиве города.Можно ли что-то добавить в функцию SelectionSort, которая бы соответствовала изменениям, произошедшим в массиве city, с другими массивами?Нужно ли мне даже сортировать каждый массив или есть более простой способ, который мне просто не хватает?

Я пока не могу использовать такие вещи, как "#include алгоритм" и "сортировка ()", иЯ также использую пространство имен std.

void SelectionSort(string city[], int size) 
{
    int i;
    int j;
    int indexSmallest;
    string temp;

    for (i = 0; i < size; ++i)
    {

        indexSmallest = i;
        for (j = i + 1; j < size; ++j)
        {

            if (city[j] < city[indexSmallest])
            {
                indexSmallest = j;
            }
        }

        temp = city[i];

        city[i] = city[indexSmallest];

        city[indexSmallest] = temp;
    }
}

Вывод должен выглядеть примерно так.

4 Независимость Кайла Дэвиса, KS 2.98
8 Независимость Даниила Эрла, KS 3.77
1 Натан Хамфери, Канзас, MO 3.35
2 Сара Джонатан Лис, Саммит, MO 3.56
3 Kayla James Liberty KS3.78

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

Используя методы, использованные в этом ответе , вы можете создать массив индексов и отсортировать массив индексов по интересующим вас критериям. Затем при ссылках на данные отсортированным образом,Вы используете индексный массив.

#include <vector>
//...
std::vector<int> index_array;
int main()
{
    for (int i = 0; i < number_of_items; ++i)
        index_array.push_back(i);
//...
    SelectionSort(city, size)
}

void SelectionSort(string city[], int size) 
{
    int i;
    int j;
    int indexSmallest;
    string temp;

    for (i = 0; i < size; ++i)
    {
        indexSmallest = i;
        for (j = i + 1; j < size; ++j)
        {
            if (city[index_array[j]] < city[index_array[indexSmallest]])
            {
                indexSmallest = j;
            }
        }

        temp = index_array[i];
        index_array[i] = index_array[indexSmallest];
        index_array[indexSmallest] = temp;
    }
}

Затем при доступе к массивам используйте массив индексов:

for (int i = 0; i < size; ++i)
   std::cout << city[index_array[i]] << "\n" << names[index_array[i]] << "\n\n";
0 голосов
/ 22 сентября 2019

Если вы храните массивы, возможно, попробуйте сделать это с std::vector или std::list, что позволит вам использовать следующую функцию упорядочения.

Я бы использовал функцию, чтобы получить классификацию для одного изваши массивы (в вашем примере города).что-то вроде

template<class _Array> void get_ordered_index(const _Array& arr, std::vector<size_t>& mapped)
{
    mapped.resize(arr.size());
    std::map<_Array::value_type, size_t> ordering_map;
    size_t i = 0;
    for (i = 0; i < arr.size(); i++)
    {
        ordering_map[arr[i]] = i;
    }
    i = 0;
    for (auto&& item : ordering_map)
    {
        mapped[i] = item.second;
        i++;
    }
}

Вы получаете заказ с:

std::<vector> order;
get_ordered_index(city, order)

, затем распечатываете

for (size_t i = 0; i < order.size(); i++)
{
    std::cout << city[order[i]]/*whatever is next*/<<std::endl;
}

Полный рабочий пример:

int main()
{
    std::vector<std::string> city{"Kansas","LeesSummit", "Liberty","Independence"  };
    std::vector<std::string> names{ "Humphery","Jonathan", "James","Davis" };
    std::vector<size_t> order;
    get_ordered_index(city, order);
    size_t j;
    for (size_t i = 0; i < order.size(); i++)
    {
        j = order[i];
        std::cout << city[j]<<' '<< names[j] <<std::endl;
    }
}

выходы:

Индепенденс Дэвис
Канзас Хамфери
LeesSummit Джонатан
Либерти Джеймс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...