Линейная сортировка двумерного массива в C - PullRequest
2 голосов
/ 03 марта 2011

Я новичок в программировании на C и пытался подготовить несколько программ сортировки.Я сделал программу линейной / нормальной сортировки.

Теперь я хочу сделать программу для сортировки 2D-массива.т.е.

если матрица

4  6  1
3  2  9
5  7  8

, тогда результат должен быть

1  2  3
4  5  6
7  8  9

Пожалуйста, помогите мне найти логику о таких программах.

Ответы [ 6 ]

1 голос
/ 03 марта 2011

Поскольку вы хотите, чтобы ваш 2D-массив сортировался по строкам, что является порядком, в котором многомерные массивы хранятся в C, вы можете сделать вид, что это одномерный массив, и отсортировать его таким образом.

Если у вас есть функция void sort(int[], int size);, которая берет указатель на первый элемент одномерного массива и его размер, вы можете сделать

int a[3][3] = {{4,6,1}, {3,2,9}, {5,7,8}};
sort(&a[0][0], 9);

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

0 голосов
/ 01 февраля 2019

Я сделал это так, поскольку вы сделали двумерный массив a [] [] и такие элементы, как я:

for(i=0;i<row;i++)
 for(j=0;j<col;j++)
  for(k=0;k<row;k++)
   for(p=0;p<col;p++)
      if(a[i][j]>a[k][p])
      temp=a[i][j]; a[i][j]=a[k][p]; a[k][p]=temp;
0 голосов
/ 03 марта 2011

Вы также можете воспользоваться подходом C ++ и сделать следующее, представляя вашу матрицу в 1D:

#include <vector>
#include <algorithm>
using namespace std;

int main(int arg, char **argv) {
  int matrix[] = {4, 6, 1, 3, 2, 9, 5, 7, 8};
  vector<int> matvec (matrix, matrix + sizeof(matrix) / sizeof(int));
  sort(matvec.begin(), matvec.end());
  return 0;
}
0 голосов
/ 03 марта 2011

Основная идея заключается в сортировке массива на основе порядка ячеек, поэтому вам нужно иметь способ получить ячейку на основе ее порядка и способ записи ячейки на основе ее порядка.

int getCellOrder(int x, int y) {
   return x*(x_width) + y;
}

int getXpos(int cellOrder) {
   return cellOrder / x_width;
}

int getYpos(int cellOrder) {
   return cellOrder % x_width;
}

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

int valueAt(int cellOrder) {
   return array[getXpos(cellOrder)][getYpos(cellOrder];
}

То, как вы сравниваете ордера и как вы меняете их, теперь становится простой проблемой одномерного массива.

0 голосов
/ 03 марта 2011

вы можете использовать Bubble-Sort: Wikipedia и пройти через массив с помощью цикла for.

0 голосов
/ 03 марта 2011

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

Просто передайте в функцию адрес первого элемента матрицы (обычно name_of_the_matrix[0]) и количество элементов в матрице.

Надеюсь, что смогу помочь.

...