Jump to content
polska

Qsort coluna específica de matriz

Recommended Posts

polska

Boas pessoal, é possível usar a função qsort para ordenar matrizes? Se sim, podem-me ajudar com a função de comparação do qsort?

Edited by brunoais
titulo melhorado.

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Share this post


Link to post
Share on other sites
polska

o que é uma matriz ordenada ?

Tens razão..

Quero ordenar uma matriz em ordem à primeira posição de cada elemento ..


Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Share this post


Link to post
Share on other sites
polska

O que eu quero dizer, assim de uma forma mais simples, primeira coluna de cada linha da matriz...

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Share this post


Link to post
Share on other sites
HappyHippyHippo
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

#define NROWS 3
#define NCOLUMNS 3

void populate(int matrix[][NCOLUMNS])
{
 int i, j;

 // iniciar o gerador de números pseudo-aleatórios
 srand(time(NULL));

 // ciclo e linhas
 for (i = 0; i < NROWS; i++)
 {
   // ciclo das colunas
   for (j = 0; j < NCOLUMNS; j++)
   {
       // atribuir um número aleatório
       matrix[i][j] = rand() % 1000;
   }
 }
}

void output(int matrix[][NCOLUMNS])
{
 int i, j;

 // imprimir a matrix no stdout)
 printf("MATRIX : \n");
 for (i = 0; i < NROWS; i++)
 {
   for (j = 0; j < NCOLUMNS; j++)
     printf("%3d ", matrix[i][j]);
   printf("\n");
 }
 printf("\n");
}

int my_compare(const void * elem1, const void * elem2)
{
 // retornar a comparação dos primeiros elementos de cada linha
 return *(int *)elem1 - *(int *)elem2;
}

int main(void)
{
 // isto só funciona se a matrix estiver codificada desta maneira :
 int matrix[NROWS][NCOLUMNS];

 // se for ao contrário ([columna][matrix]) já não possivel fazer com qsort

 // pupolar a matrix com dados aleatórios
 populate(matrix);
 output(matrix);

 // ordenar as linhas da matrix pelo primeiro elemento de cada linha
 qsort(matrix, NROWS, sizeof(int) * NCOLUMNS, my_compare);
 output(matrix);

 return 0;
}

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
polska

Obrigado Happy, mas já agora, se eu quisesse ordenar em ordem da segunda coluna, na função compare bastava incrementar os apontadores e devolver a subtracção certo?


Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Share this post


Link to post
Share on other sites
HappyHippyHippo

sim, mas lembra-te que estas a ordenar a matriz inteira

para ordenar somente da linha n à n+m terias de alterar a chamada do qsort para :

int n, m;

qsort(&matrix[n],             // a partir da linha "n"
     m,                      // "m" linhas
     sizeof(int) * NCOLUMNS, // tamanho de cada linha
     my_compare);            // função de comparação

----

ps : cuidado com o "incremento" !! faz isso como deve ser :D

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
polska

sim, mas lembra-te que estas a ordenar a matriz inteira

para ordenar somente da linha n à n+m terias de alterar a chamada do qsort para :

int n, m;

qsort(&matrix[n],			 // a partir da linha "n"
  m,					  // "m" linhas
  sizeof(int) * NCOLUMNS, // tamanho de cada linha
  my_compare);			// função de comparação

Sim, eu sei :thumbsup:

ps : cuidado com o "incremento" !! faz isso como deve ser :D

No problem :D

Obrigado pela ajuda !


Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.