Сортировка матрицы по столбцам и по строкам - PullRequest
0 голосов
/ 25 апреля 2018

Мне нужно построить функцию, которая сортирует матрицу по строкам, а затем по столбцам или наоборот, сохраняя значения внутри матрицы.Матрица представляет собой огромную матрицу, поэтому алгоритм, который я использую, должен быть алгоритмом nlogn.

У меня есть следующая структура:

typedef struct{
unsigned int line, column;
float value;}Matrix;

Matrix matrix[size_of_matrix*size_of_matrix];
static int numb_of_matrix; /*Whenever I ask the user to insert values to the matrix, I increase this number to insert the structure inside my vector matrix*/

Я также храню индексы maximun и minimunстроки и столбцы, которые заполняются пользователем, и индексы между этими границами устанавливаются как 0, поэтому я создаю матрицу size_of_matrix * size_of_matrix, полную нулей, а затем вставляю туда свои значения, сохраняя при этом самый высокий и самый низкий индекс строки истолбец, заполненный пользователем.

Учитывая это, мне нужно отсортировать свою матрицу, отсортировав их в порядке возрастания строк, а затем в порядке возрастания столбцов или наоборот.То, как я должен знать, каким образом мне нужно сортировать матрицу, это попросить пользователя ввести C, если мне нужно сначала отсортировать матрицу по столбцам, если мне нужно сначала отсортировать матрицу по строкам.

Итак, если бы я ввел в матрицу следующее:

[0,3]=1.2
[3,0]=2.1
[4,5]=2.2
[2,5]=3.2
[3,5]=4.2

, а затем сначала отсортировал его по строкам, он должен стать

[0,3]=1.2
[2,5]=3.2
[3,0]=2.1
[3,5]=4.2
[4,5]=2.2

Эта проблема будетбыстро решить, была ли матрица достаточно маленькой, но моя матрица будет иметь около 1 миллиона значений, поэтому я не могу использовать подобные сортировки пузырьков или любой другой алгоритм сортировки n ^ 2.

1 Ответ

0 голосов
/ 01 мая 2018

Формат, в котором вы сохраняете матрицу, называется триплетным форматом. Сортировка их в порядке строк или столбцов означает сохранение их в формате сжатого разреженного столбца (CSC) или сжатого разреженного ряда (CSR). Большинство разреженных библиотек реализовали их эффективно. Преобразование CSC в CSR или наоборот - это просто транспонирование матрицы. Если вы ищете небольшой эффективный код, вы можете посмотреть на функцию "cs_transpose" в SuiteSparse / CSparse. Для преобразования триплета в любую сжатую форму это просто так. подсчитывать количество элементов в каждой строке / столбце, а затем размещать их в нужном месте по порядку (как сортировка по группам). Алгоритм будет bo O (n), но элементы в строке / столбце не сортируются. Простым решением будет их транспонирование. Транспонирование дважды фактически используется на практике!

...