Сортировка многомерного массива с сохранением порядка
Есть такой код, нужно сделать сортировку методом быстрой сортировки, но проблема в том что если отсортировать массив allUnits[0] (не обращайте внимание на структуру, так нужно по заданию и это не влияет на решение проблемы), то привязка конкретной строки к конкретному столбцу пропадёт, в моём случае строки это года, а столбцы это работники и сам элемент который находится на пересечении столбца и строки это зарплата конкретного работника в конкретный год. Вопрос как можно сделать сортировку чтобы в итоге вывести информацию о годе и работнике в порядке возрастания зарплаты по типу printf("%d работник заработал %d в %d году \n", ?, ?, ?);
Вот задание для полного понимания: "Пусть рассматривается два подразделения, в первом подразделении работает m работников, во втором - m1. Работа каждого подразделения анализируется с n последних лет. Для каждого работника указана заработная плата за соответствующий год (задается с клавиатуры). Необходимо определить, два маленькие заработки за все годы работы обоих подразделений (реализовать с помощью функции). Отсортировать заработную плату работников первого и второго подразделения методом быстрой сортировки (реализовать в виде функции)."
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <stdio.h>
#include <math.h>
struct unit {
int** yearIncome, minIncome1 = 0, minIncome2 = 0;
};
void minElements(struct unit *arr, int yrs, int wrk) {
int i, j, k;
for (i = 0; i < 2; i++) {
for (j = 0; j < yrs; j++) {
for (k = 0; k < wrk; k++) {
if (arr[i].yearIncome[j][k] > 0 && (arr[i].yearIncome[j][k] < arr[i].minIncome1 || arr[i].minIncome1 == 0))
{
arr[i].minIncome2 = arr[i].minIncome1;
arr[i].minIncome1 = arr[i].yearIncome[j][k];
}
if (arr[i].yearIncome[j][k] > arr[i].minIncome1 && (arr[i].yearIncome[j][k] < arr[i].minIncome2 || arr[i].minIncome2 == 0))
{
arr[i].minIncome2 = arr[i].yearIncome[j][k];
}
}
}
}
for (i = 0; i < 2; i++)
{
printf("minIncome1 = %d \n", arr[i].minIncome1);
printf("minIncome2 = %d \n", arr[i].minIncome2);
}
}
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i, j, k, years, workers;
struct unit allUnits[2];
printf("Введите кол-во лет и работников: \n");
scanf("%d %d", &years, &workers);
for (i = 0; i < 2; i++) {
allUnits[i].yearIncome = (int**)malloc(years * sizeof(int*)); // Выделение памяти под указатели на строки
}
for (i = 0; i < 2; i++) {
printf("Для %d подраздела:\n", i + 1);
for (j = 0; j < years; j++) {
allUnits[i].yearIncome[j] = (int*)malloc(workers * sizeof(int)); // Выделение памяти под хранение строк
for (k = 0; k < workers; k++) {
int income;
printf("Введите зарплату %d работника за %d год:\n", k + 1, j + 1);
scanf("%d", &income);
printf("\n");
allUnits[i].yearIncome[j][k] = income;
}
}
}
printf("\n\n");
for (i = 0; i < 2; i++) {
printf("У %d подраздела:\n", i + 1);
for (j = 0; j < years; j++) {
for (k = 0; k < workers; k++) {
printf("Зарплата %d работника за %d год: %d\n", k + 1, j + 1, allUnits[i].yearIncome[j][k]);
}
}
}
minElements(allUnits, years, workers);
return 0;
}