By i307, March 20, 2010 in C
Cá estou eu de volta dos vectores.
Alguém me pode explicar porque é que isto não está a imprimir o numero do vector?
Porque na última chamada a printf estás a fazer indexação com a variável aux e tens de fazer com a variável i que é a que está a percorrer o array.
Ah , pensei que o valor passava.
Não percebi muito bem o que querias dizer no teu último post mas o que importa é que já está a funcionar.
p.s. Tenta melhorar as tuas explicações sobre o teu problema. Ajudas os outros a ajudarem-te
Bem , isto supostamente recebia os valores todos que eram introduzidos e imprimia-os em sequência.
Acontece que está a dar um valor completamente diferente do introduzido. Por isso deve estar alguma coisa a atribuir como aleatorio.
int v[50];
printf("Com quantos numeros deseja trabalhar??");
v[aux]=v;
while(aux < n);
for (aux=0 ; aux < n;aux++) {
printf("%i",v[aux]);
Aqui não é v, porque isso é um apontador para o 1º elemento do vector. Tens de lhe passar uma posição do vector:
scanf("%i",&v[aux]);
E apagas aquele v[aux]=v.
É a chamada ao scanf, tens de passar o array com indexação aux
Sim , já percebi
Desculpa, não tinha visto o post do Baderous.
Precisava de encontrar o maior e menor numero do vector.
Li algures que uma maneira fácil de o fazer era usando o qsort do C e depois mostrar a 1a e a ultima posição do vector.
Será que é a melhor maneira?
Se não me engano a função qsort tem complexidade O(log N) portanto isso é mais rápido do que percorreres o array todo e ires actualizando uma variável. Este último tem complexidade O(N). No entanto, para usares a função qsort tens de criar uma função que vai fazer a comparação entre dois elementos do array. Isso inclui ponteiros e parece-me que ainda não chegaste a essa parte.
É melhor, percorrer o array com um for e ires actualizando uma variável que vai conter o máximo no final. Dentro do for, comparas a posição actual com a variável que vai conter o máximo. Se a posição actual for maior actualizas se não continuas.
p.s. Se estiver enganado quanto às complexidades que me corrijam sff.
O melhor caso do quicksort não é O(log N), mas sim O(n log n).
Pra varrer ou procurar algo num vector não tem muita complexidade. Ordenar é que é !!
Usa o for.
Mas como procuras pelo maior ou menor, primeiro ordenas o vector e depois pesquisas.
Pra ordenar, dizem que o Qsort só é eficiente caso o vector esteje mto desorganizado. Usa o bubblesort, visto o vector não ser tão grande.
Obrigado Baderous pela correcção
Já que ainda não cheguei aos ponteiros. Vou fazer com um for
void bubble( int v[], int n )
int k = n - 1 ;
Tenho isto mas está mal. Dá o numero de número de valores introduzidos +1.
Tenho isto numa função aparte portanto acho que deveria ter um return mas não sei a que devo fazer.
Mas o que é que tu queres? Queres ordenar um array ou encontrar o valor minimo e o máximo?
Não precisas de ordenar array nenhum para isso. Além de que o bubble sort é um péssimo algoritmo de ordenação visto que tem complexidade O(n2) no melhor caso.
Se tiveres dúvidas em como encontrar o minimo e o máximo sem ordenar avisa.
O bubble sort foi dos 1ºs algoritmos pra ordenação. Hoje em dia usa-se mais o Shellsort e o Quicksort, mas não sei se consegues implantar ai um destes.
Localhost, acho que ordenar o vector 1º torna a procura mais fácil. Depois de organizar é só procurar pelo valor na posição zero e na ultima que ele ja tem o maior e o menor.
O que achas que é mais rápido? O(n2) ou O(n)?
O que estás a sugerir é muito ineficaz. Se forem 1.000.000 de posições imagina quanto tempo vai levar. Mais vale percorrer o array e ir fazendo o que tinha dito alguns posts atrás.
O n2 é o mais ineficaz deles todos, ou seja, o bubblesort. Mas no entanto é bom pra ele começar a perceber o mecanismo de ordenação visto o vector não ser muito grande.
Hoje em dia usa-se mais nlog n, Shellsort e Quicksort, o número de comparações é muito inferior logo é mto + rápido.
Mas no entanto cabe ao i307 decidir o que fazer. Eu tenho comigo o código em C das 3 funções de ordenação, pois tenho dado isto na faculdade, posso ir ajudando.
Pelo que percebi o bubblesort é melhor para vectores pouco desordenados.
Eu queria usar um qualquer. selection sort , insertion sort ou quicksort.
O meu problema é como aplicar.
Já te perguntei isto e estamos a andar à volta de um problema que não existe. O que é que tu queres fazer? Queres ordenar ou descobrir o maior? É inútil ordenar quando podes percorrer e descobrir. Poupas uma função e é muito mais simples.
Se não sabes descobrir o maior queres saber ordenar? Para alguns algoritmos de ordenação como o Selection Sort precisas de saber descobrir o maior. Então é inútil estares a ordenar só para fazer isso.
Deixo-te aqui um pseudo-código de como descobrir o maior:
percorre todo o array {
se posActual > temp
temp = posActual
Eu estava a pensar implementar o ordenamento para depois obter o maior sem descobrir o maior pela forma mais "simples".
Apenas pondo um printf do v[0].
Mas se uma coisa tem de levar à outra.
Se tu queres perder algum tempo (desnecessário) a aprender algoritmos de ordenação é contigo.
Eu dei-te aí a solução, agora é só implementares.
Existem algoritmos de ordenação em que precisas de trabalhar com memória dinâmica, por isso acho que é completamente desnecessário.