Menor numero em C

Já várias vezes que li este tópico, mas só agora me lembrei e achei interessante partilhar.

Dado um vector, e vários inputs, pretende-se achar o menor número entre dois elementos a e b.
Caso se pretenda só achar o minimo entre dois limites, um simples for entre "a" e "b" chega. Mas caso se pretendam achar vários mínimos com "a" e "b" diferentes, o problema torna-se demasiado lento para se resolver por pesquisa bruta. (Daria algo aproximadamente O(n*size) sendo "n" o número de pesquisas e "size" o tamanho do vector)

É possível, no entanto, acelerar este processo, através de minimum range queries.

Com algum pré-processamento (O(nlogn)) e memória adicional (O(nlogn) também) podemos obter em tempo constante o mínimo entre dois pontos num vector.
Não tenho tempo para explicar em pormenor, mas quem estiver interessado pode ver mais aqui:

http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor
 
ja agora deixo uma sujestao tb muito simples:


Código:
...
int min,i;
            min=array[0];
 
           for(i=0;i<contador;i++)
           {
               if(min>array[i])
                    min=array[i]; 
           }
 
            printf("\nVALOR MINIMO:\t%d",min);
...

axo k é o mais simples até agora e em C(que foi pedido), feedback please....:kfold:
 
Yeps, em C duvido que dê para fazer melhor que isso (sem optimizações manhosas como o Warrior falou)

A do souto também me parece bastante boa, mas não sei até que ponto comparar com um valor de um array será mais ou menos lento que com parar com uma variável local.
O meu voto vai para o código do walterwolf...
 
Última edição:
boas,

Não sei se ajuda, mas o algoritmo bubble sort é uma algoritmo de ordenação [não é o unico, mas serve :P], se ordenares um vector o 1 elemento desse vector será o menor numoro da lista....
Existe na net milhares de exemplo do algoritmo é só pesquisar e adaptar o codigo.

Espero k ajude
Cump,
 
boas,

Não sei se ajuda, mas o algoritmo bubble sort é uma algoritmo de ordenação [não é o unico, mas serve :P], se ordenares um vector o 1 elemento desse vector será o menor numoro da lista....
Existe na net milhares de exemplo do algoritmo é só pesquisar e adaptar o codigo.

Espero k ajude
Cump,

yah tens razão, seria fixe tb ordenar o array de forma crescente(conheço três algoritmos, troca directa(o mais fácil) , bubble sort e o quick sort) e no fim o menor numero estará na 1ª posiçao, sendo assim era so imprimir o valor da posição de memoria "zero" ( printf(%d,array[0]); )

ps: se alguém precisar dos algoritmos eu posso arranjar.

peace
 
o objectivo do exercício é só encontrar o menor número, certo?
então para que é que vamos perder tempo a ordenar o array?
é mais eficiente percorrer o array para encontra o menor número do que estar a ordená-lo (a menos que depois precise do array ordenado). acho que a solução do walterwolf e outras apresentadas anteriormente servem perfeitamente...
mas se mesmo assim assim optarem por ordenar o array, o C já disponibiliza funções de ordenação (nomeadamente a 'qsort'), não é preciso estarem a implementá-las.
 
a é? entao é so chamar a funcao qsort e que recebe o array como paramentro, tipo qsort(nome_do_array)??????

a função 'qsort' (assim como a 'heapsort' e a 'mergesort') recebe o endereço do primeiro elemento que queremos ordenar do array, o número de elementos que queremos ordenar, o tamanho de cada elemento e a função que vai comparar os elementos.

é só fazer 'man qsort' para ver uma descrição mais detalhada destas funções.
 
Última edição:
a função 'qsort' (assim como a 'heapsort' e a 'mergesort') recebe o endereço do primeiro elemento que queremos ordenar do array, o número de elemento que queremos ordenar, o tamanho de cada elemento e a função que vai comparar os elementos.

é só fazer 'man qsort' para ver uma descrição mais detalhada destas funções.

yah thanks pela dica:wavey:
 
#include<stdio.h>

void main()
{
int n, menor,maior,i,t=0,r=0;
printf("introduza 5 numeros\n");
for(i=0;i<5;i++)
{
scanf("%i",&n);
if(n>0)
{
t=t+1;
if(t==1)
{
menor=n;
maior=n;
}
if(t!=0)
{
if(n<menor)
{
menor=n;
}
if(n>maior)
{
maior=n;
}
}
}
if(n<=0)
{
r=r+1;
}

}
if(r!=5)
{
printf("o menor e:%i, o maior e:%i\n", menor,maior);
}
else
{
printf("nao introduzio nenhum numero valido\n");
}
}
_______________//_____________

só aceita números positivos, calcula maior e menor.
O primeiro número é o maior e menor, é incorrecto atribuir um numero muito grande ao maior, ou o oposto para o menor, este programa aceita os negativos como introduzido, mas basta eliminar as condições a partir do if(n<=0) . Força nisso!
Eu também estou a aprender.
 
Dessa forma estás a comparar um a um, o objectivo é em array.

Já agora, usa as tags [code] CÓDIGO [/code] quando quiseres escrever código, isso assim não é nada legível...

abraços, HecKel
 
Back
Topo