2015-06-29 6 views
1

Я пытаюсь сортировать массив 2d. Сначала я сортирую его по столбцу, а затем по строкам. Столбец по столбцу работает, но строка за строкой нет. Что не так в этом коде?Сортировка 2D-массива с qsort

int scmpr (const void *a, const void *b){ 
return strcmp((const char*)a, (const char*)b); 
} 

int main(void){ 
    int i,j; 

    char **tab; 
    tab=(char**)malloc(sizeof(char*)* 10); 

    for(i=0; i<10; i++){ 
    tab[i]=(char*)malloc(sizeof(char)*15); 
    } 

    for(i=0; i<10; i++){ 
    for(j=0; j<15; j++){ 
     tab[i][j]=rand()%20+'b'; 
     printf("%c ", tab[i][j]); 
    } 
    puts(""); 
    } 
    for (i = 0; i<10; i++){ 
    qsort(&tab[i][0], 15, sizeof(char), scmpr); 
    } 
    qsort(tab, 10, sizeof(char), scmpr); //<-- doesn't work 

    for(i=0; i<10; i++){ 
     for(j=0; j<15; j++){ 
     printf("%c ", tab[i][j]); 
     } 
    puts(""); 
    } 
    puts(""); 
    return 0; 
    } 
+0

остановки литье в 'malloc' Это не C++. – Malina

+0

Каждая строка сортируется здесь: http://ideone.com/IhUAFV – PaulMcKenzie

+2

@ Krasnal Прежде всего строки в массиве не завершены нулем и этот вызов qsort (& tab [i] [0], 15, sizeof (char) , scmpr); не имеет смысла. –

ответ

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

int scmpr (const void *a, const void *b){//receive char ** 
    return strcmp(*(const char**)a, *(const char**)b); 
} 
int ccmpr (const void *a, const void *b){//compare one char 
    unsigned char x = *(unsigned char *)a; 
    unsigned char y = *(unsigned char *)b; 
    return (x > y) - (x < y); 
} 

int main(void){ 
    int i,j; 

    char **tab; 
    tab=(char**)malloc(sizeof(char*)* 10); 

    for(i=0; i<10; i++){ 
     tab[i]=(char*)malloc(sizeof(char)*16);//+1 for NUL char to use strcmp 
    } 

    for(i=0; i<10; i++){ 
     for(j=0; j<15; j++){ 
      tab[i][j]=rand()%20+'b'; 
      printf("%c ", tab[i][j]); 
     } 
     tab[i][j] = 0;//set NUL 
     puts(""); 
    } 
    for (i = 0; i<10; i++){ 
     qsort(&tab[i][0], 15, sizeof(char), ccmpr); 
    } 
    qsort(tab, 10, sizeof(char*), scmpr);//element is char* 

    puts(""); 

    for(i=0; i<10; i++){ 
     for(j=0; j<15; j++){ 
      printf("%c ", tab[i][j]); 
     } 
     puts(""); 
    } 
    //deallocate 
    return 0; 
} 
0

qsort

сортировки элементов массива

Сортирует NUM элементов массива, на который указывает основание, каждый размером элемент длиной байтов, используя Compar функцию определить порядок.

Алгоритм сортировки, используемый этой функцией, сравнивает пары элементов , вызывая указанную функцию сравнения с указателями на них как аргумент .

Функция не возвращает никакого значения, но изменяет содержимое массива, на который указывает базовое изменение порядка его элементов, как определено .

Порядок эквивалентных элементов не определен.

В результате он сортирует каждую группу из 15 элементов в списке i, как обычный массив, который даст вам результат, который вы видите. Однако, поскольку «j» разделены. Что вам нужно сделать, так это создать таблицу с одним измеренным массивом для каждой строки из группы для каждого значения i. Затем, после выполнения qsort на каждой отдельно определенной строке, переместите их в исходную 2D-таблицу.

qsort(tab, 10, sizeof(char*), scmpr);//element is char* 

будет передавать первые 10 (символьных) элементов вкладки, а не строки, как вы планировали.

2

Я думаю, что вы имеете в виду следующее

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

#define M 10 
#define N 15 

int ccmp(const void *lhs, const void *rhs) 
{ 
    unsigned char c1 = *(const unsigned char *)lhs; 
    unsigned char c2 = *(const unsigned char *)rhs; 

    if (c1 < c2) return -1; 
    else if (c2 < c1) return 1; 
    else return 0; 
} 

int scmp(const void *lhs, const void *rhs) 
{ 
    return strcmp(*(const char **)lhs, *(const char **)rhs); 
} 

int main(void) 
{ 
    char **tab; 
    tab = (char**)malloc(M * sizeof(char*)); 

    for (size_t i = 0; i < M; i++) 
    { 
     tab[i] = (char*)malloc(N * sizeof(char)); 
    } 

    srand((unsigned int)time(NULL)); 

    for (size_t i = 0; i < M; i++) 
    { 
     for (size_t j = 0; j < N - 1; j++) 
     { 
      tab[i][j] = rand() % ('Z' - 'A' + 1) + 'A'; 
     } 
     tab[i][N-1] = '\0'; 
    } 

    for (size_t i = 0; i < M; i++) 
    { 
     printf("%s\n", tab[i]); 
    } 

    printf("\n"); 

    for (size_t i = 0; i < M; i++) 
    { 
     qsort(tab[i], N - 1, sizeof(char), ccmp); 
    } 
    qsort(tab, M, sizeof(char *), scmp); 

    for (size_t i = 0; i < M; i++) 
    { 
     printf("%s\n", tab[i]); 
    } 

    printf("\n"); 

    for (size_t i = 0; i < M; i++) free(tab[i]); 
    free(tab); 

    return 0; 
} 

Выход программы может выглядеть следующим образом

DJSKLJOHGHEANW 
ZSDZJZXCKGYOVF 
LHEOQYAEHOLPYR 
PLORDTQOSNQFVP 
TQUEYAVQYVUHKH 
WIZOVPHYKXPEMF 
JHUFARLARGQSEN 
BOWYYXOTMVTYUI 
DIOOPKVPDHPXPI 
PTXQJVQHTGCHDY 

AAEFGHJLNQRRSU 
ADEGHHJJKLNOSW 
AEEHHLLOOPQRYY 
AEHHKQQTUUVVYY 
BIMOOTTUVWXYYY 
CDFGJKOSVXYZZZ 
CDGHHJPQQTTVXY 
DDHIIKOOPPPPVX 
DFLNOOPPQQRSTV 
EFHIKMOPPVWXYZ