Не корректная сортировка 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]);