Сортировка динамического массива (двумерного / одномерного)
Всех приветствую! Недавно начал изучать C++ для дальнейшего применения в UE Есть задача, никак не могу разобраться с сортировкой.
Общий смысл: программа принимает количество игроков, создается двумерный динамический массив. После произвольно заполняем имя и число условных очков в соответствии с ранее заданным количеством игроков.
Получаем на выходе промежуточно список игроков и количество их очков.
После чего нужно получить список игроков отсортированный по убыванию очков.
На этом моих знаний перестало хватать. Пробовал использовать метод сортировки и на этом завис. Не могу разобраться как грамотно вызвать эту функцию. И что-то мне подсказывает что саму функцию я адаптировал неправильно Прошу помочь с решением)) По возможности с комментариями для понимания процесса))
#include <string>
using namespace std;
void insertionSort(int rows[], int cols) // Функция сортировки
{
for (int i{}; i < rows; i++)
{
for (int j{}; j < cols; j++)
{
int j = i - 1;
while (j >= 0 && rows[j] > rows[j + 1])
{
swap(rows[j], rows[j + 1]);
cout << "Сортировка...";
j--;
}
}
}
}
int main()
{
setlocale(0, ""); // русская локализация консоли
int rows; //кол-во рядов (строк) массива
int cols = 2; //кол-во столбцов массива
cout << "Введите количество игроков: ";
cin >> rows; // получение от пользователя количества игроков (размера массива)
cout << "==============================================" << endl;
cout << "Введите имена " << rows << " игроков: " << endl;
string** dynamic_array = new string*[rows]; // создаем динамический массив (выделение памяти для массива)
for (int i{}; i < rows; i++)// Заполнение массива и вывод значений его элементов
{
dynamic_array[i] = new string[cols]{};
}
// вводим данные
for (int i{}; i < rows; i++)
{
cout << "Введите имя и очки игрока " << (i + 1) << " через пробел:" << endl;
// вводим данные для столбцов i-й строки
for (int j{}; j < cols; j++)
{
cin >> dynamic_array[i][j]; // считываем числа в ячейки массива
}
}
cout << "==============================================" << endl;
insertionSort(); //Какие аргументы в скобках?
// вывод данных
for (int i{}; i < rows; i++)
{
// выводим данные для столбцов i-й строки
for (int j{}; j < cols; j++)
{
cout << dynamic_array[i][j] << " ";
}
cout << endl;
}
for (int i = 0; i < rows; i++)
{
delete[] dynamic_array[i]; // очистка памяти
}
delete[] dynamic_array; // удаляем динамический массив
return 0;
}
Функция сортировки просто не срабатывает.
Был второй вариант решения с динамическим массивом структур, но это для меня совсем темный лес.
Так же пробовал вариант одномерного динамического массива, но для такого варианта не придумал как прикрепить имена.
#include <iostream>
#include <string>
using namespace std;
//обозначаем массив структур
struct SPlayerData
{
string Name;
int Rate{ 0 };
};
void insertionsort(int *dynamic_array, int plauers) //функция сортировки методом "Сортировка вставками"
{
for (int i = 1; i < plauers; i++)
{
int j = i - 1;
while (j >= 0 && dynamic_array[j] > dynamic_array[j + 1])
{
swap(dynamic_array[j], dynamic_array[j + 1]);
cout << "Сортировка" << endl;
j--;
}
}
}
int main()
{
setlocale(0, ""); //русская локализация консоли
// размер массива
int plauers;
cout << "Введите количество игроков : ";
cin >> plauers; //получение от пользователя количества игроков (размера массива)
//const int plauers = 5;
cout << "==============================================" << endl;
//SPlayerData plauer[plauers] = {};
cout << "Введите имена " << plauers << " игроков: " << endl;
int *dynamic_array = new int[plauers]; //создаем динамический массив (выделение памяти для массива)
//вводим данные
for (int i = 0; i < plauers; i++)
{
// Заполнение массива и вывод значений его элементов
dynamic_array[i] = i;
cout << "Введите имя и очки игрока " << (i + 1) << " через пробел:" << endl;
cin >> dynamic_array[i];
}
cout << "==============================================" << endl;
//вывод данных до сортировки
for (int i = 0; i < plauers; i++)
{
// Заполнение массива и вывод значений его элементов
cout << "Значение " << i << " элемента " << dynamic_array[i] << endl;
}
cout << "==============================================" << endl;
insertionsort(dynamic_array, plauers); //вызов функции сортировки массива
cout << endl;
//вывод данных после сортировки
for (int i = 0; i < plauers; i++)
{
// Заполнение массива и вывод значений его элементов
cout << "Значение " << i << " элемента " << dynamic_array[i] << endl;
}
delete[] dynamic_array; //удаляем динамический массив
return 0;
}
В общем прошу помощи сделать варианты рабочими.
Отредактировал сортировку в коде, сортировка не работает, полагаю что-то не так с синтаксисом.
#include <string>
using namespace std;
void insertionSort(int dynamic_array[], int rows)
{
int t, i, j;
for (i = 1; i < rows; i++)
{
t = dynamic_array[i];
j = i - 1;
while (j >= 0 && dynamic_array[j] > t)
{
dynamic_array[j + 1] = dynamic_array[j];
j--;
}
dynamic_array[j + 1] = t;
}
}
int main()
{
setlocale(0, ""); // русская локализация консоли
int rows; //кол-во рядов (строк) массива
int cols = 2; //кол-во столбцов массива
cout << "Введите количество игроков: ";
cin >> rows; // получение от пользователя количества игроков (размера массива)
cout << "==============================================" << endl;
cout << "Введите имена " << rows << " игроков: " << endl;
string** dynamic_array = new string*[rows]; // создаем динамический массив (выделение памяти для массива)
for (int i{}; i < rows; i++)// Заполнение массива и вывод значений его элементов
{
dynamic_array[i] = new string[cols]{};
}
// вводим данные
for (int i{}; i < rows; i++)
{
cout << "Введите имя и очки игрока " << (i + 1) << " через пробел:" << endl;
// вводим данные для столбцов i-й строки
for (int j{}; j < cols; j++)
{
cin >> dynamic_array[i][j]; // считываем числа в ячейки массива
}
}
cout << "==============================================" << endl;
void insertionSort(int dynamic_array[], int n); //Какие аргументы в скобках?
// вывод данных
for (int i{}; i < rows; i++)
{
// выводим данные для столбцов i-й строки
for (int j{}; j < cols; j++)
{
cout << dynamic_array[i][j] << " ";
}
cout << endl;
}
for (int i = 0; i < rows; i++)
{
delete[] dynamic_array[i]; // очистка памяти
}
delete[] dynamic_array; // удаляем динамический массив
return 0;
}```
Ответы (1 шт):
Сортировка вставками не требует обменов, она сдвигает часть массива, затем вставляет элемент на его окончательное место.
void insertionSort(int A[], int n) {
int t, i, j;
for (i = 1; i < n; i++) {
t = A[i];
j = i - 1;
while (j >= 0 && A[j] > t) {
A[j + 1] = A[j];
j--;
}
A[j + 1] = t;
}
}