Не удается передать массив в функцию сортировки (нужно сортировать столбцы, а не строки) - PullRequest
1 голос
/ 27 мая 2019

Мне нужно использовать сортировку выбора для сортировки двумерного массива. Проблема в том, что мне нужно сортировать столбцы массива, а не строки. Вот как я выделяю двумерный массив (чтобы показать структуру):

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

Есть идеи, как это сделать? Прямо сейчас я переставляю матрицу дважды, а между транспозициями я сортирую ее, но я не думаю, что это хороший вариант из-за ее медлительности.

1 Ответ

0 голосов
/ 27 мая 2019

Вы можете сделать так, чтобы у вашей функции был получатель типа 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);
...