Jump to content
Sign in to follow this  
AdolfoFerreira

Ordenação de arrays dependentes

Recommended Posts

AdolfoFerreira

Antes de mais, muito boa tarde a todos!

Já acompanho este forum há bastante tempo, principalmente na secção de Haskell, mas apenas à pouco tempo me decidi registar ;)

Tou aqui com uma dúvida pertinente, que já me tá a fazer arrancar cabelos xD

Eu optei por chamar arrays dependentes, porque eu tenho dois arrays de inteiros, que estão dependentes um do outro.

Como exemplo,

numeroaviao[x] -> categoriaaviao[x]
15 -> 1
69 -> 2
78 -> 1
89 -> 3
71 -> 2
23 -> 1
...

O meu objectivo prende-se em ordenar os aviões por categorias, mas que o numero do avião seja mantido, ou seja:

numeroaviaoord[x] -> categoriaaviaoord[x]
15 -> 1
78 -> 1
23 -> 1
69 -> 2
71 -> 2
89 -> 3
...

Por isso é que eu digo que os arrays estão dependentes um do outro.

Alguém me pode dar uma ajudazinha com isto?

Eu tentei da seguinte forma, mas não me está a dar completamente direito :S

Nota: O numero do avião, para ser mais fácil são números de 1 a 10.

int main ()
{
    int numeroavião[10],numeroaviãoord[10],categoria[10],categoriaord[10],x=0,i, j, chave,chave2;
    for (x=0;x<10;x++)numeroavião[x]=x+1;
    printf("\nIntroduza 10 categorias respectivas ao aviao:\n");
    for (x=0;x<10;x++)scanf("%d",&categoria[x]);
    printf("O Vector original fica:\n");
    for (x=0;x<10;x++) printf("U:%d | T:%d \n",numeroavião[x],categoria[x]);
    printf("-------------------");
    for(x=0;x!=10;x++) categoriaord[x]=categoria[x]; //Copia o vector para um auxiliar
    for(x=0;x!=10;x++) numeroaviãoord[x]=numeroavião[x];
for(j=1; j<10; j++) // Ordena o vector auxiliar
{
	chave = categoriaord[j];
	chave2 = numeroavião[j];
	i = j-1;
	while(i >= 0 && categoriaord[i] > chave)
	{
		categoriaord[i+1] = categoriaord[i];
		numeroavião[i+1]= numeroaviãoord[i];
		i--;
	}
        if (categoriaord[i]!=3){		
	categoriaord[i+1] = chave;
	numeroaviãoord[i+1]=chave2;}
}
    printf("\n\nO Vector ordenado fica:\n");
    for (x=0;x<10;x++) printf("U:%d | T:%d \n",numeroaviãoord[x],categoriaord[x]);
    printf("\n");
    system("pause");
    return 0;
}

Desde já, obrigado a todos e um Bom Natal! :)

Share this post


Link to post
Share on other sites
Localhost

Ordenas o segundo vector, utilizando por exemplo o algoritmo de bubble sort. Quando trocas de posição, também trocas no primeiro vector.


here since 2009

Share this post


Link to post
Share on other sites
AdolfoFerreira

Ordenas o segundo vector, utilizando por exemplo o algoritmo de bubble sort. Quando trocas de posição, também trocas no primeiro vector.

Tive à procura do Bubble Sort, e dei-me com isto:

void swapbubble( int v[], int i)
{ 
    int aux=0; 
    aux=v[i];
    v[i] = v[i+1];
    v[i+1] = aux;
}

void bubble(int v[], int qtd)
{
int i;
int trocou;
do
{
        qtd--;
	trocou = 0;
		for(i = 0; i < qtd; i++)
		if(v[i] > v[i + 1])
		{
			swapbubble(v, i);
			trocou = 1;

		}
}while(trocou);
}

Neste momento já tenho a minha cabeça em água de tanto olhar para o algoritimo anterior xD

Como é que eu ordeno o categoria de modo a que o numeroaviao tb se altere?

Share this post


Link to post
Share on other sites
Localhost

Chamas a função swapbubble com o primeiro vector.

Óbvio que o bubble sort é apenas um exemplo de um algoritmo de ordenação. Apenas falei dele porque é bastante simples de se implementar, além de não ser muito eficiente.


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Já vi que estás mesmo confuso.

Vou tentar deixar a ideia:

* Implementar algoritmo clássico de bubble sort com ligeira modificação na parte da troca;

  * Fazer dois ciclos com duas variáveis, i e j, por exemplo;

  * Se o valor que se encontra na posição i for maior do que o valor que se encontra na posição j, trocar os valores dessas posições nos dois vectores;


here since 2009

Share this post


Link to post
Share on other sites
AdolfoFerreira

Já vi que estás mesmo confuso.

Vou tentar deixar a ideia:

* Implementar algoritmo clássico de bubble sort com ligeira modificação na parte da troca;

  * Fazer dois ciclos com duas variáveis, i e j, por exemplo;

  * Se o valor que se encontra na posição i for maior do que o valor que se encontra na posição j, trocar os valores dessas posições nos dois vectores;

Essa era a minha lógica no exemplo que eu dei em cima, usando uma alteração do Insertion Sort. Só que não me tava a dar correcto. Vou tentar adaptar o Bubble, pode ser que funcione ^^

EDIT:

Estourou outra vez xD

#include <stdio.h>

int main ()
{
    int numeroaviao[10],numeroaviaoord[10],categoria[10],categoriaord[10],x=0,i, j, chave,chave2,trocou,qtd=20;
    for (x=0;x<10;x++)numeroaviao[x]=x+1;
    printf("\nIntroduza 10 categorias respectivas ao aviao:\n");
    for (x=0;x<10;x++)scanf("%d",&categoria[x]);
    printf("O Vector original fica:\n");
    for (x=0;x<10;x++) printf("U:%d | T:%d \n",numeroaviao[x],categoria[x]);
    printf("-------------------");
    for(x=0;x!=10;x++) categoriaord[x]=categoria[x]; //Copia o vector para um auxiliar
    for(x=0;x!=10;x++) numeroaviaoord[x]=numeroaviao[x]; // O mesmo do anterior
  for(i = 20; i > 0; i--)
  {
    trocou=0;
    for(j = 0; j < i; j++)
    {
      if(categoriaord[j] > categoriaord[j+1])
      {
        chave = categoriaord[j];
        categoriaord[j] = categoriaord[j+1];
        categoriaord[j+1] = chave;
        trocou=1;
      }
    }
  }
    printf("\n\nO Vector ordenado fica:\n");
    for (x=0;x<10;x++) printf("U:%d | T:%d \n",numeroaviaoord[x],categoriaord[x]);
    printf("\n");
    system("pause");
    return 0;
}

Não ordena direito --'

Share this post


Link to post
Share on other sites
IceBrain

Isso não faria mais sentido fazer uma estrutura que agrupasse os dois valores, e depois ter uma lista/array de estruturas?


❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Share this post


Link to post
Share on other sites
Localhost

@IceBrain, ele deixou bem claro que queria ter dois vectores diferentes.

@AdolfoFerreira, vê se isto ajuda:

para i = 0 ate n:
   para j = 0 ate n:
      se v2[j] > v2[j + 1]:
          swap = v1[j]
          v1[j] = v1[j + 1]
          v1[j + 1] = swap

          swap = v2[j]
          v2[j] = v2[j + 1]
          v2[j + 1] = swap


here since 2009

Share this post


Link to post
Share on other sites
AdolfoFerreira

Com o algoritimo do Localhost construí o seguinte algoritmo de ordenação:

void ordenarfila(int u[],int p[], int tamanho)
{
     int i, j, temp,temp2;
     
     for(i = 0; i < tamanho - 1; i++){
             
         for(j = 0; j < tamanho - 1; j++){
             if(u[j] > u[j + 1]){
                 temp = u[j];
                 temp2= p[j];
                 u[j] = u[j + 1];
                 u[j + 1] = temp;
                 p[j] = p[j + 1];
                 p[j + 1] = temp2;
                 
             }
         }
     }
}

Funcionou perfeitamente!

Simplesmente, para correr essa função no meu código final utilizei:

int main ()
{
    int numeroaviao[10],numeroaviaoord[10],categoria[10],categoriaord[10],x=0,i, j, chave,chave2,trocou,qtd=20;
    for (x=0;x<10;x++)numeroaviao[x]=x+1;
    printf("\nIntroduza 10 categorias respectivas ao aviao:\n");
    for (x=0;x<10;x++)scanf("%d",&categoria[x]);
    printf("O Vector original fica:\n");
    for (x=0;x<10;x++) printf("U:%d | T:%d \n",numeroaviao[x],categoria[x]);
    printf("-------------------");
    for(x=0;x!=10;x++) categoriaord[x]=categoria[x]; //Copia o vector para um auxiliar
    for(x=0;x!=10;x++) numeroaviaoord[x]=numeroaviao[x]; // O mesmo do anterior
    ordenarfila(categoriaord,numeroaviaoord);
    printf("\n\nO Vector ordenado fica:\n");
    for (x=0;x<10;x++) printf("U:%d | T:%d \n",numeroaviaoord[x],categoriaord[x]);
    printf("\n");
    system("pause");
    return 0;
}

O meu objectivo final não era para esse programa. Simplesmente isto faz parte de um programa muito maior, que só me faltava mesmo a ordenação dos dois vectores.

Fica sempre este snippet de ordenação em C, pode ser que alguém posteriormente o ache útil!

Obrigado a todos, em especial ao 127.0.0.1 ;)

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
Sign in to follow this  

×
×
  • 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.