Не корректная сортировка 2d массива методом пузырька

#include <iostream>
void InitializeArray(const int, char *, int, int);
void DisplayArray(const int, char *);
void Sort_bubble(const int, char *);
void Swap(char &, char &);
int main() {
  system("clear");
  int min = int('!'), max = int('@'), size = 5;
  char arr[size][size];
  printf("\t\tGenerated array\n");
  InitializeArray(size, *arr, min, max);
  DisplayArray(size, *arr);
  printf("\n\t\tSorted array\n");
  Sort_bubble(size, *arr);
  DisplayArray(size, *arr);
  return 0;
}
void InitializeArray(const int size, char *arr, int min, int max) {
  srand(time(NULL));
  for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
      *(arr + i * size + j) = min + rand() % (max - min + 1);
    }
  }
}
void DisplayArray(const int size, char *arr) {
  for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
      printf("%c ", *(arr + i * size + j));
    }
    printf("\n");
  }
}
void Sort_bubble(const int size, char *array) {
  for (int i = 0; i < size; i++)
    for (int j = 0; j < size; j++)
      if (array[j] > array[j + 1])
        Swap(array[j], array[j + 1]);
}
void Swap(char &a, char &b) {
  char temp = a;
  a = b;
  b = temp;
}

Проблема в том, что программа сортирует лишь до нулевого элемента первой строки. Пример выполнения программы:В данном случае посортировало до элемента '@'


Ответы (1 шт):

Автор решения: DmitryK

Собственно сортировка у вас написана. Правда с ошибкой выхода за пределы массива.

for (int j = 0; j < size; j++) // если size реальный размер массива
      if (array[j] > array[j + 1])  // то array[j + 1] - выход за его пределы на последней итерации
// должно быть
for (int j = 0; j < size-1; j++)

С учетом того, что двумерный массив arr[size][size] на самом деле в памяти хранится линейно как одномерный arr[size*size] (как и написал Harry), просто измените граничное значение, до которого будет идти сортировка с size до size*size.

for (int i = 0; i < size*size; i++)
    for (int j = 0; j < size*size-1; j++) // поскольку вы используете array[j + 1] 
      if (array[j] > array[j + 1])
        Swap(array[j], array[j + 1]);

Ну и немного оптимизации, чтобы не проходить повторно по уже отсортированному куску массива

for (int i = size*size-1; i > 0 ; i--)
   for (int j = 0; j < i; j++)
      if (array[j] > array[j + 1])
         Swap(array[j], array[j + 1]);
→ Ссылка