Domanda

Ho bisogno della funzionalità di QSORT per il mio programma e finora non ha fatto il suo lavoro.

Sto essenzialmente ordinando una serie di valori di singoli carattere per raggrupparli in gruppi in modo da poter iterare attraverso l'array e determinare i conteggi per ciascun attributo. Il mio problema è che Qsort sta restituendo un array "ordinato" come

xxxxxbxbbbxfbxfbffffbxfxbbfbbbxxfxbxxfbbbbxbfxbxfbxbsxbbbxxbbxxffxbxfxfxbxxbxxfbbbfbxbbx
bbbsxfxbxbxxbfbfxbxxbxxbfxxbxsbfxxfxfxfffxbfxffbbfffsxsfbfbxbxbbbxxsbfbfbbbbbbxxfxfxffxf
xbxxbxfxbfbxbxxbxbxxbxbbffxxbxxffxxbxfxbxffxfsfxxfxxfxxfxfxxfxxbsxxbbbxsxxbbxxxbxfxsbxxx
ffbxfxxffbxxxfxxfxxfxfxxfffbxxxbxxxfffxsbbfffffxxxbbfxsbffxbxxfxbxxfbbfsbffsfffxfxfxbbffx
bxxfxbxxfxbbbfxxbbfxxbbbsxbxfbfbbxxbbfffxxfxxbbbfxxbxxxbbxxxbfxffxxxffxfxxffbxfsxbxxxfxfx
fsbbbxxxbfxfffsfxxxfssxxxfxfxxxxbxbbbxxbxxxxxxxxxxxxxxxxxxxfbfxxffxxbxxxxxxxsxsxxxxxxxxsxb
bxxxxxfxbxxxxfxxfxxxxxbbxfffbxbsxffbbbxsfbbfffbxbfbbxxbxxbbxxbffxfxxfxfbbxxbxfxxsfxxfxxbxf
xxbxxxbxbxbbxbbffxxxxbfbfxxxxxxfxffxxxxxxxxxxxxxxxxxxxxxbxffxbxbxbbxbbxxfbxfxbxxbxxbxbxxxb
xxbxbxbfbbffffffsbbxxbffbxfxxfxbfbfffsxbxxxsxxbbbbbxxxbxxxfxxfffxxxxxxxxxxxxxfxxbxxxxxxxxx
xxbfbxxxxxxxxxxxxxxxxxxxxxxxxxxbxbxxxxxfxxbxxxxffxbxxxxffxfbfffxbxxfxbfxbxxfxbxbfxxxxxfxbx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsbxxxxffxfxxxxxxxxxfxfxxxbffffxxxfbxbxfxxxxxxxxxxxxxxxxxxxxf
fxfxbfxxxfxxxxx

Penso che il problema abbia a che fare con la mia chiamata o il metodo di confronto.

int compare(const void *a, const void *b){
  return *(char * const *) a - *(char * const *) b;
}

ed è usato in

qsort(temp, lineCount, sizeof(char), compare);

dove temp è l'array di personaggi sopra e lineCount è il numero di caratteri nell'array. Sia l'integrità dell'array che le dimensioni sono state verificate attraverso i test.

Qualsiasi aiuto è molto apprezzato.

È stato utile?

Soluzione

char * const * è un puntatore a un puntatore a Char. Vuoi solo un puntatore da Char.

Provare:

int compare(const void *a, const void *b){
    return *(const char *) a - *(const char *) b;
}

Anche, sizeof(char) è sempre uguale a 1, per definizione. Quindi alcuni programmatori C non lo scriverebbero mai così. (È una questione di opinione se semplifica il codice più facile da leggere o solo segnali che non conosci davvero la lingua. Mi piace in questo caso, ma solo FYI.)

Altri suggerimenti

Almeno all'inizio, scrivo solo confronto un po 'più esplicitamente e riga per linea per il debug più facile:

int compare(const void *a, const void *b)
{
    char* alpha = (char*)a;   // Might get const-warning on these lines, ignore for now.
    char* beta  = (char*)b;

    if (*alpha == *beta) return 0;
    if (*alpha < *beta) return -1;
    return 1;
}

In questo modo, puoi guardarlo nel debugger più facilmente, aggiungere linee di uscita e generalmente abbattere il problema.

Una volta che funziona di nuovo, è possibile ricombarlo in un'unica linea di codice compatta.

Prova questo:

int compare(const void *a, const void *b){
  return *(const char *) a - *(const char *) b;
}

Ma imho, non hai bisogno qsort affatto!

Basta creare una tabella di int [256] (o forse meno) e iterare l'array per registrare il conteggio di ogni carattere:

int res[256];
memset(res, 0, 256*sizeof(int));
int i;
for (i=0;i<lineCount;i++){
    res[tmp[i]]++;
}

Ciò fornirebbe O (N) vs Qsort O (NLOGN).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top