В чём ошибка? Не выводятся одни и те же числа при сортировке

Сортировка - 3
Отсортировать матрицу n*n по схеме расположения с помощью алгоритма сортировки из Сорт-1.

#include <iostream>
#include <iomanip>
using namespace std;


// Создание динамической матрицы
void newMatrix(int**& a, int n)
{
    a = new int* [n];
    for (int i = 0; i < n; i++)
        a[i] = new int[n];
}

// Вывод матрицы на консоль
void printMatrix(int** a, int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            cout << setw(4) << a[i][j];
        cout << endl;
    }
}

// Заполнение матрицы случайнми числами
void randomMatrix(int** a, int n)
{
    srand(time(NULL));
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            a[i][j] = rand() % (n * n);
}

// копирование из матрицы в массив
int* mass(int** a, int n) {
    int* b = new int[n * n];
    int Ai = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            b[Ai] = (a[i][j]);
            Ai++;
        }
    return b;
    }
}
// Функция сортирует массив а по неубыванию методом подсчета
void sortArray(int* a, int n)
{
    int* c = new int[n];
    for (int i = 0; i < n; i++) //обнуление счётчиков
        c[i] = 0;
    //Подсчет
    for (int i = 0; i < n - 1; i++)
        for (int j = i + 1; j < n; j++)
            if (a[i] >= a[j])
                c[i]++;
            else
                c[j]++;
    //Расстановка
    int* b = new int[n];
    for (int i = 0; i < n; i++) {
        b[c[i]] = a[i];
    }

    for (int i = 0; i < n; i++) {
        a[i] = b[i];
    }

}
// Фукнция заполняет матрицу по схеме расположения (по строкам)
void fillSnakeMatrix(int** a, int* b, int n)
{
    int k = 0;

    for (int i = n - 1; i >= 0; i--)
    {
        if (i % 2 == 0) {

            for (int j = (n / 2) - 1; j >= 0; j--) {
                a[i][j] = k++;
            }

        }

        else
            for (int j = 0; j < n / 2; j++) {
                a[i][j] = k++;
            }
    }

    for (int j = n / 2; j < n; j++)
    {
        if (j % 2 == 0) {
            for (int i = 0; i < n; i++) {
                a[i][j] = k++;
            }

        }

        else
            for (int i = n - 1; i >= 0; i--) {
                a[i][j] = k++;
            }
    }
}




int main()
{
    setlocale(LC_ALL, "Russian");
    int n;
    do {
        cout << "Input n" << endl;
        cin >> n;
    } while (n < 1 || n > 10);

    int** a = new int*[n];



    newMatrix(a, n);

    randomMatrix(a, n);

    cout << "1 Matrix:" << endl;
    printMatrix(a, n);

    int* b = mass(a, n);
    

    sortArray(b, n*n);


    //int* ar = NULL;


    fillSnakeMatrix(a, b, n);

    cout << "2 Matrix:" << endl;
    printMatrix(a, n);

    system("pause");
    return 0;

} ```

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

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

А они и не должны выводиться. Потому что этот код не имеет никакого отношения к сортировке подсчетом.
Сортировка подсчетом:

  • первый проход по массиву - подсчет количества чисел в массиве, в отдельный массив счетчиков, в котором число является индексом
  • второй проход - запись в массив чисел, исходя из их количества

А у Вас в sortArray() совсем иное:
По алгоритму нужно подсчитывать количество чисел. А у вас подсчитывается что-то не понятное. А с расстановкой тем более непонятно что делается.

    for (int i = 0; i < n - 1; i++)
        for (int j = i + 1; j < n; j++)
            if (a[i] >= a[j])  // подсчет неизвестно чего
                c[i]++;
            else
                c[j]++;

Просто ради интереса выведите в консоль массивы b[] и c[]и посмотрите на их содержимое!
В общем вся эта функция должна выглядеть гораздо проще:

void sortArray(int* a, int n) // n - размерность матрицы
{
    int* c = new int[n*n];
    for (int i = 0; i < n * n; i++) //обнуление счётчиков можно сделать через memset()
        c[i] = 0;
    //Подсчет
    for (int i = 0; i < n; i++)
        c[ a[i] ]++;  // изначальные числа a[i] являются индексами в массиве счетчиков c[i]

    //Расстановка
    int l = 0;
    for (int i = 0; i < n *n; i++) // проход по массиву счетчиков
       for (int j = 0; i < c[i]; j++) // запись c[i] элементов i в массив a
          { 
             a[l] = i;
             l++;
          }
    delete[] c;
}

Кроме всего прочего:

  • нигде не освобождается ранее выделенная память
  • производится множественное копирование матрицы в массив, массивов в матрицу, хотя можно сортировать сразу матрицу.
    Дальше не смотрел.
→ Ссылка
Автор решения: DmitryK

Спасибо за комментарий @Stanislav Volodarskiy.
Если рассматривать через подсчет элементов, меньших текущего, то код действительно рабочий. Ошибка только в одном месте - return b; стоит до закрывающей скобки цикла, а должен быть после. Если использовать другой стиль оформления кода, то она сразу же стала бы заметна:

// копирование из матрицы в массив
int* mass(int** a, int n) 
{
    int* b = new int[n * n];
    int Ai = 0;
    for (int i = 0; i < n; i++) 
    {
        for (int j = 0; j < n; j++) 
        {
            b[Ai] = (a[i][j]);
            Ai++;
        }
    // return b;  // был здесь - функция заканчивалась после обработки 1 строки матрицы
    }
    return b;  // должен быть здесь
} 
→ Ссылка