Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RinaldFN

[Resolvido] vetor em ordem crescente

Recommended Posts

Olá a todos.Eu tenho um vetor com varios valores e preciso ordenar os valores de forma crescente. Gostaria de saber e em C existe uma função propria para isso..O que poderia fazer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara...c tem eu não sei...em java eu sei q tem...c naum tiver em C...procura por Bubble Sort, Quick Sort...esses são os métodos mais comuns...o mais facil d se entender no comeco eh o Bubble Sort...ele eh bem simpleszinho...e você gasta 5 ou 6 linhas pra fazer ele... (sem contar os includes, e outras babozeiras más ^^)tenta ae...qqr coisa...posta seu codigo ae que eu te ajudo no Bubble Sortflws ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

É fácil implementar uma função.

 

Siga o conselho do camarada acima e comece pesquisando por Bubble Sort, Quicksort, Merge Sort etc. Veja qual se adapta melhor ao que você precisa fazer.

 

Uma função de ordenação na biblioteca standard do C. Vou dar quote já que o texto não é meu =P:

void qsort(void *base, size_t num, size_t width, int (*compare)(const void *elem1, const void *elem2)); - Implementa uma ordenação, usando o algoritmo quicksort, num vector de num elementos passado por base, em que cada elemento tem width bytes. Esta função necessita que lhe seja passada uma outra função (compare) que aceite 2 apontadores para elementos de width bytes e retorne um valor que indique qual é o maior (<0 se elem1 menor do que elem2, =0 se elem1 for idêntico a elem2, >0 se elem1 for maior do que elem2).

Compartilhar este post


Link para o post
Compartilhar em outros sites

tens aqui um exemplo

 

http://programmers.com.sapo.pt/cprogs.htm

 

http://programmers.com.sapo.pt/Cvector.htm

 

 

para ordenar é como no pascal, é obvio que as implmentação muda :

 

http://programmers.com.sapo.pt/pascalprogs.htm

 

escolhes a ordenação de um vector...

 

http://programmers.com.sapo.pt/ordenarvector.htm

 

 

Cypher :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Value pelas dicas pessoal!

 

Tentei fazer um exemplo aqui, mais parece que tem erro de lógica:

 

main(){   float vet[4],aux;   int i;  vet[0]=0;   vet[1]=1;	vet[2]=2;	 vet[3]=3; for(i=0;i<4;i++) { if(vet[i]<vet[i+1]) {  aux=vet[i];  vet[i]=vet[i+1];  vet[i+1]=aux; } } for(i=0;i<4;i++) cout<<vet[i]<<"\n";	  system("PAUSE>nul");}

 

Alguem sabe como consertar?

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites
for(i=0;i<4;i++){if(vet[i]<vet[i+1])
Nesta parte vai ter uma hora em que i=3 e você procurará um vet[4] (que não existe).

Compartilhar este post


Link para o post
Compartilhar em outros sites

é mesmo hein!No caso eu teria que parar o for quando i fosse igual ao total de elementos do vetor -1 não é?Vou fazer uns testes por aqui! se alguem conseguir valeu!Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

for(i=0;i<4;i++){   if(vet[i]<vet[i+1])   {	  aux=vet[i];	  vet[i]=vet[i+1];	  vet[i+1]=aux;	}}
faça o teste d mesa deste trecho..

você vai verificar que este laço naum ordena vetor algum..

ele no maximo "joga" o menor elemento pra ultima posiçao..

 

para você fazer uma estrutura basica de ordenação, você deve comparar cada elemento com seus sucessores e se satisfazer a condição de este ser menor, fazer a troca..

entao soh esta faltando mais um for que vai controlando o elemento..

 

pense ai.. e tente implementar seu codigo..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo valeu pela ajuda!

 

Consegui fazer um que funcione, porém ouvir falar que este método não é seguro quando formos ordenar uma quantidade grande de dados.

 

O que vcs acham?

 

O programa ficou assim:

 

#include <iostream.h>#include <stdlib.h>#define N 4int main(){	  float vet[N],aux;	  int i,j;	  vet[0]=0;   vet[1]=45;	vet[2]=8;	 vet[3]=-2;	  vet[3]=80;	  for(i=0;i<N;i++)	  {	  for(j=0;j<N;j++)	  {	  if(vet[i]>vet[j]){  aux=vet[i];  vet[i]=vet[j];  vet[j]=aux;}}}	 for(i=0;i<N;i++)	 cout<<vet[i]<<"\n";	  system("PAUSE");	  return 0;}

 

 

Obrigado a todos que me ajudaram!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele é um método muito lento. Vou te dar um exemplo de um livro que tenho aqui.Ignorando o tempo que leva para trocar qualquer elemento fora de posição, assuma que cada comparação leve 0,001 segundos. Para ordenar 10 elementos são gastos 0,05 segundos, 100 elementos são 5 segundos e ordenar 1000 elementos levará 500 segundos. Uma ordenação de 100000 elementos (o tamanho de uma pequena lista telefônica) levará em torno de 5000000 de segundos ou 1400 horas ou 2 mêses direto!A ordenação bolha sempre executa 1/2 * (n² - n) comparações. Onde n é o número de elementos. Por isso ela se torna tão lenta enquanto vai aumentando o número de elementos.Este tipo de ordenação é chamado de ordenação n-quadrado, pois seu tempo de execução é um múltiplo do quadrado do número de elementos. (aí você imagina porque de sua pouca eficiência para números maiores)

Compartilhar este post


Link para o post
Compartilhar em outros sites

cont = 0; 				   while (cont < 4) {						 for (i = 0; i < (4 -1); i++ ) {							 if (vet[i] > vet[i+1]) {								aux = vet[i];								vet[i] = vet[i+1];								vet[i+1] = aux;							 } 						 }				   cont++;   				   }				   for (i = 0; i < 4; i++) {					   printf ("\n ---Ordem Crescente:  %d", vet[i]);							 				   }

Cara assim ele só faz as comparações necessárias. Caso você queira mudar para ordem decrescente eh só mudar na condição IF para "<"

 

if (vet[i] < vet[i+1]) {

Compartilhar este post


Link para o post
Compartilhar em outros sites

conheço um metodo bem mais agil que o metodo bolha convencional..

 

eis ele:

suponha que você tenha o vetor:

|9|8|5|6|2|0|1|

 

podemos organiza-lo comparando em pares, como o metodo bolha..

a diferença eh q naum necessita comparar um elemento com seus antecessores..

para ordem crescente,

comparando o primeiro indice com este metodo teremos:

|8|9|5|6|2|0|1|

|5|9|8|6|2|0|1|

|5|9|8|6|2|0|1|

|2|9|8|6|5|0|1|

|0|9|8|6|5|2|1|

|0|9|8|6|5|2|1|

 

repare que ele joga o menor valor pro começo..

naum precisando comparar a posição de indice 2 com seu antecessor, ja que sabemos q este ja eh menor..

 

entao o codigo ficaria assim:

for(i=0;i<n-1;i++)  for(j=i+1;j<n;j++)	 if(<vetor>[i] > <vetor>[j])		/* troca-se seus valores
repare q a variavel j eh inicializada em i+1 e naum em 0 como o metodo bolha..

 

agora existem varios metodos. Alguns excepsionais..

confira aqui

 

flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

ricci, supondo que "n" = 3, nesse seu exemplo vai entrar no laço apenas 2 valores, não seria ??

 

for(i=0;i<n;i++)
  for(j=i+1;j<n;j++)
	 if(<vetor>[i] > <vetor>[j])
		/* troca-se seus valores

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.