Qsorting 2d указательные массивы

Я пытаюсь сортировать 2d массив указателей, используя qsort. Единственная проблема, с которой я сейчас сталкиваюсь, – это то, что я использовал статически объявленные массивы, теперь переходящие к указателям. Я почти соблазн переключиться на структуры, но быть упрямым, что я не могу заставить это работать.

До сих пор я malloc 2d массив указателей [array2d [m] [3] был предназначенного размера]:

int **array2d; array2d = (int**)malloc((m)*sizeof(int*)); for(i=0; i<=m; i++) array2d = [i]=(int*)malloc(3*sizeof(int)); qsort(array2d, m, 3*sizeof(int**),comp); 

Мое сравнение:

 int comp(const void* left, const void*right) { const int *a = *(const int**)left; const int *b = *(const int**)right; return ab; } 

Хотя я не уверен, как структурировать сравнение для работы с 2d указателями.

Из приведенного fragmentа кода я предполагаю, что вы пытались сортировать каждую строку матрицы отдельно. Первое, что я заметил, это то, что в распределении памяти столбцов (2-й индекс) матрицы содержится опечатка.

Правильное распределение памяти в матрице numRow x numColumns будет следующим:

 /* loop counter */ int i; /* dynamic array sizes */ const int numRow = 5; const int numColumns = 25; /* allocate the row pointers */ int **dynamic2d = (int **)malloc(numRow * sizeof(int *)); /* for each row pointer */ for(i = 0; i < numRow; i++) { /* allocate columns */ dynamic2d[i] = (int *)malloc(numColumns * sizeof(int)); } 

Затем вы не сможете просто вызвать метод qsort (..) только один раз. Этот метод предполагает «плоский» или одномерный массив. Вам нужно будет вызвать метод qsort (...) отдельно для каждой строки матрицы. Это показано ниже:

 /* sort array */ for(i = 0; i < numRow; i++) qsort(dynamic2d[i], numElements, sizeof(int *), comp); 

Наконец, вы сделали ошибку со своим методом компаратора. Этот метод имеет строгие правила, которые необходимо соблюдать для правильной работы. Текущие спецификации говорят: « Приложение должно гарантировать, что функция возвращает целое число меньше, равное или больше 0, если первый аргумент считается соответственно меньше, равен или больше второго. Если два члена сравниваются как равно, их порядок в отсортированном массиве не указан ».

Это простое исправление. Просто напишите логику для получения этих результатов, как показано ниже:

 int comp(const void* firstArg, const void* secondArg) { /* get the values of the arguments */ int first = *(int *)firstArg; int second = *(int *)secondArg; /* return the value as expected by the qsort() method */ if(first < second) { return 1; } else if(second < first) { return -1; } return 0; } 

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

 int comp(const void* firstArg, const void* secondArg) { /* get the values of the arguments */ int first = *(int *)secondArg; int second = *(int *)firstArg; ... } 

или же

 /* print greatest to smallest */ for(i = 0; i < numRow; i++) { /* start at front and work to back */ for(j = 0; j < numColumns; j++) printf("%d ", dynamic2d[i][j]); printf("\n"); } /* print smallest to greatest */ for(i = 0; i < numRow; i++) { /* start at back and work to front */ for(j = numColumns- 1; j >= 0; j--) printf("%d ", dynamic2d[i][j]); printf("\n"); } 

Надеюсь, это поможет! Если вам нужно отсортировать всю матрицу в целом ... это совсем другой зверь.