Мне нужно использовать сортировку выбором для сортировки двумерного массива. Проблема в том, что мне нужно сортировать столбцы массива, а не строки. Вот как я выделяю двумерный массив (чтобы показать структуру):
int** array = new int*[rows];
for (int i = 0; i < rows; i++) {
array[i] = new int[columns];
}
Затем я добавляю в него некоторые элементы. Вот моя функция сортировки:
void selectionSort(int* arr, int n)
{
int i, j, min_idx;
for (i = 0; i < n; i++)
{
min_idx = i;
for (j = i + 1; j < n; j++)
if (arr[j] < arr[min_idx])
min_idx = j;
swap(&arr[min_idx], &arr[i]);
}
}
Я не указываю своп, так как он говорит сам за себя.
Итак, опять же, мне нужно отсортировать каждый столбец матрицы. Например:
Вход:
5 3 1
2 0 9
4 2 6
Выход:
2 0 1
4 2 6
5 3 9
Любые идеи о том, как это сделать? Сейчас я дважды транспонирую матрицу, а между транспозициями сортирую ее, но не думаю, что это хороший вариант из-за его медлительности.
К сожалению, это необходимо
Вам нужно реализовать собственный алгоритм сортировки или вы можете использовать std::sort
?
Я должен использовать сортировку выбором
Вы можете создать шаблон своей функции, чтобы иметь геттер int:
template <typename F>
void selectionSort(F f, int size)
{
for (int i = 0; i < size; i++)
{
int min_idx = i;
for (int j = i + 1; j < size; j++)
if (f(j) < f(min_idx))
min_idx = j;
swap(f(min_idx), f(i));
}
}
Итак, в одном измерении у вас есть старое:
selectionSort([arr](int i) -> int&{ return arr[i]; }, n);
и для столбца:
selectionSort([arr, j](int i) -> int&{ return arr[i][j]; }, n);
Спасибо, это сработало. Могу я попросить некоторые разъяснения, пожалуйста? Как это работает? Почему мы называем f подобной функцией? И почему мы называем сортировку выбором именно так, с указателем и возвратом?
[](){}
— это лямбда, это функтор, который мы можем вызывать как обычную функцию.
По какой причине вы используете выделенный вручную массив вместо
std::vector
?