RinaldFN 0 Denunciar post Postado Maio 18, 2006 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
Marcelo Lipienski 9 Denunciar post Postado Maio 18, 2006 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
skimo-solar 0 Denunciar post Postado Maio 18, 2006 É 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
Cypher 0 Denunciar post Postado Maio 18, 2006 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
RinaldFN 0 Denunciar post Postado Maio 18, 2006 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
skimo-solar 0 Denunciar post Postado Maio 19, 2006 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
RinaldFN 0 Denunciar post Postado Maio 19, 2006 é 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
ricci ottadnot 4 Denunciar post Postado Maio 20, 2006 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
RinaldFN 0 Denunciar post Postado Maio 20, 2006 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
Marcelo Lipienski 9 Denunciar post Postado Maio 20, 2006 esse é o método bolha...não é que ele não seja seguro...seguro todos são...só que ele não é muito eficiente para grandes vetores. Compartilhar este post Link para o post Compartilhar em outros sites
RinaldFN 0 Denunciar post Postado Maio 21, 2006 Então,Eu gosteria de saber porque ele não é tão seguro para grandes vetores.. esse grande seria quanto? Compartilhar este post Link para o post Compartilhar em outros sites
skimo-solar 0 Denunciar post Postado Maio 21, 2006 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
wFs 0 Denunciar post Postado Maio 22, 2006 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
ricci ottadnot 4 Denunciar post Postado Maio 23, 2006 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 valoresrepare 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
gRoOvE 0 Denunciar post Postado Junho 26, 2008 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