Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

polska

Qsort coluna específica de matriz

Mensagens Recomendadas

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?

Editado por brunoais
titulo melhorado.

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
polska

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

Editado por polska

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;
}

  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.