2013-11-10 1 views
0

Я пытаюсь отсортировать многомерный массив с QSort, но результат нонсенс ..рода многомерный массив с QSort в C

Мой код (выдержка):

#include <stdio.h> 
#include <stdlib.h> 

int srovnejVelikost(const void *p1, const void *p2) { 
    const long int (*a)[5] = p1; 
    const long int (*b)[5] = p2; 
    return ((*a)[0] + (*a)[1] - (*b)[0] - (*b)[1]); 
} 

long int nadrze[200000][5]; 

[values added into the array here] 

qsort (nadrze, 200000, sizeof(nadrze[0]), srovnejVelikost); 

Он должен сортировать nadrze [ ] в соответствии с результатом (nadrze [a] [0] + nadrze [a] [1] - nadrze [b] [0] - nadrze [b] [1]) .... все 5 перемещенных элементов

Спасибо за помощь. Это очень ценится.

+0

* «результат - бессмыслица» * Сначала укажите, как многомерный массив считается «отсортированным». Для меня, без какой-либо информации, это не имеет никакого смысла. – Manu343726

+0

Также подумайте о переводе кода на английский. Это помогает понять ваш код. – Manu343726

+0

Язык не проблема, перевод в этом случае не принесет никакой пользы ... Например: nadrze [0] = {-10,20,0,0,0}, nadrze [1] = {5 , 40,0,0,0}; Сортировка должна выполняться путем сравнения (nadrze [0] [0] + nadrze [0] [1]) и (nadrze [1] [0] + nadrze [1] [1]). Последний больше (45 против 10), поэтому nadrze [1] должен быть после nadrze [0] в отсортированном массиве. Проблема в том, что при печати значений после сортировки я получаю огромные числа, которые не имеют для меня никакого смысла. (должны быть те же значения, что и до сортировки, просто отсортированы) – user2976787

ответ

0
int arr[10][100]; 
for(i=0;i<10;i++){ 
    qsort(arr[i],------,-----,----); 
} 

Это многомерный массив можно отсортировать по одному, QSort не может сортировать все в то же время.

1

Если критерии сортировки действительно nadrze[a][0] + nadrze[a][1] - nadrze[b][0] - nadrze[b], я нахожу следующий пример, чтобы представить его:

#include <stdio.h> 
#include <stdlib.h> 

#define max_i 5 
#define max_j 5 

int srovnejVelikost(const void *p1, const void *p2) { 
    const long int *a = p1; 
    const long int *b = p2; 
    return ((a[0] + a[1]) - (b[0] + b[1])); 
} 

int main(int argc, char **argv) 
{ 
    int i = 0; 
    int j = 0; 
    long int nadrze[max_i][max_j]; 
    long int d = 0; 

    printf("Before\n"); 
    for (i = 0; i < max_i; ++i) { 
      d = (nadrze[i][0] + nadrze[i][1]); 
      printf("i: %d %d\n",i, d); 
    } 

    qsort(nadrze, max_i, sizeof(long int)*max_j, srovnejVelikost); 

    printf("After\n"); 
    for (i = 0; i < max_i; ++i) { 
      d = (nadrze[i][0] + nadrze[i][1]); 
      printf("i: %d %d\n",i, d); 
    } 


    return(EXIT_SUCCESS); 

} 

Вы можете расшириться MAX_I и max_j, как нуждается в вашем случае. Я только что использовал defines, поскольку я тестировал.

Также обратите внимание, что я закодировал его как (a[0] + a[1]) - (b[0] + b[1]), поскольку это эквивалентно a[0] +a[1] - b[0] - b[1], и это имеет больше смысла, когда я читаю его для компаратора.

Вам необходимо пройти целый ряд к qsort, что я делаю, говоря, ширина `SizeOf (лин целое) * max_j, что в вашем случае 5.

Имеет ли это смысл?

(Функция сравнения qsort не имеет значения, если вы передадите ей один int или массив, зависит от вас, как вы справляетесь с этим. Поэтому следите за тем, чтобы вы не имели доступа к тому, что вы хотели.)