1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ordenação de arrays

Discussão em 'Programação' iniciada por kabalo, 24 de Janeiro de 2009. (Respostas: 25; Visualizações: 1244)

  1. kabalo

    kabalo Suspenso

    boas a todos.. vou ter exame de recurso a programação e tenho algumas duvidas.. tenho o seguinte programa feito onde tenho um menu com algumas opçoes e uma delas é fazer a ordenação de um array de numeros, que é a unica coisa que nao sei fazer neste programa. vou so colocar a parte da ordenaçao que tenho feita por mim para que possam ver e ajudar-me. obrigado.

    Código:
      static void ordena(int[] num)
      {
        for(int i=0;i<num.length-1;i++)
        {
          for(int j=i+1;j<num.length;j++)
          {
            if(num[j]<num[i])
              permuta(num[i],num[j]);
          }
        }
     
        for(int i=0;i<num.length;i++)
          print(num[i]+ " ");
        println();
      }
     
      static void permuta(int a, int b)
      {
        int c;
        c=b;
        a=c;
        b=a;
      }
    


    tenho outra duvida semelhante a este programa. suponham agora que tenho uma array onde posso por ate 50 numeros mas que se inserir o zero para a inserçao de numeros.. pra alem de ler a sequencia, as outra opçoes do menu sao imprimir a sequencia e calcular a media da sequencia.. ou seja.. na parte da leitura da sequencia eu preciso tambem de uma variavel para contar os numeros e de outra para ir fazendo a soma. o problema é que no fim so posso fazer return de uma das variaveis e eu preciso das 3 (a sequencia de numeros, o contador e a soma).. como faço? vou colocar aki uma parte do codigo para poderem ver:

    Código:
      static int[] lerSeq(int[] num)
      {
        int valor, cont=0, soma=0;
     
        do
        {
          valor=readInt("Introduza valor para posição "+(cont+1)+": ");
          if (valor !=0)
          {
            num[cont]=valor;
            soma=soma+valor;
            cont++;
          }
        }
        while(valor !=0);
        return num;/*-------> o problema é aki pois so posso fazer return de um valor, é que que para imprimir vou precisar de fazer return da array e do cont; e para calcular a media vou precisar de fazer return da array, da variavel cont e da variavel valor */
      }
    
    obrigado pela ajuda.
     
    Última edição: 24 de Janeiro de 2009
  2. kabalo

    kabalo Suspenso

    esqueci-me de referir no topico que é na linguagem JAVA.
     
  3. Baderous

    Baderous Banido

    O teu algoritmo parece-me uma típica implementação do Bubblesort. Vê o link para esclareceres dúvidas.
     
  4. kabalo

    kabalo Suspenso

    fiz utilizando como vi no link k me deste mas ao correr o programa da erro quando meto a opçao de ordenar. da o seguinte erro:

    java.lang.ArrayIndexOutOfBoundsException: 10
    at experiencia.ordenaSeq(experiencia.java:72)
    at experiencia.menu(experiencia.java:40)
    at experiencia.main(experiencia.java:6)

    o que é isto?
     
  5. Baderous

    Baderous Banido

    É porque estás a ultrapassar os limites do array.
     
  6. arpinacio

    arpinacio Power Member

    Deve-te faltar um "-1" numa definição de um "for"

    Lembra-te que os arrays vão de 0 a n-1, sendo n o tamanho real do array...

    um erro muito comum é fazer-se

    for(int i = 0; i <= array.size();i++)

    e deve ser

    for(int i = 0; i <= array.size()-1;i++)
     
  7. kabalo

    kabalo Suspenso

    na wikipedia tem o seguinte codigo para JAVA:

    Código:
    public static void bubbleSort(int[] a) {
      for (int i = 0; i < a.length-1; i++) {
         for (int j = 0; j < a.length-i-1; j++) {
            if (a[j] > a[j+1]) {
               swap(a, j, j+1);
            }
         }
      }
    }
    
    private static void swap(int[] a, int i, int j) {
      int temp = a[i];
      a[i] = a[j];
      a[j] = temp;
    }
    
    tipo.. eu ja consegui fazer.. mas alguem me pode explicar em linguagem normal (lol) linha por linha o que faz a função bubblesort(int[] a).. tipo.. eu ja consegui fazer isto mas foi a copiar a funçao e adaptar ao meu problema.. mas gostava de perceber linha por linha para puder perceber e fazer por mim.. é k sinceramente ainda nao consegui perceber a logica dos ciclos for por exemplo.. obrigado :)..
     
  8. Baderous

    Baderous Banido

    Faz um esquema a lápis, com um array, vários valores lá dentro desordenados, e as variáveis i e j a moverem-se e já percebes.
     
  9. kabalo

    kabalo Suspenso

    sim eu ja fiz isso.. por isso é que axo que este ciclo for nao faz sentido:

    Código:
    for (int j = 0; j < a.length-i-1; j++)
    
    é que tipo.. ele começa a 0, e vai encrementar enquanto o j for menor que o tamanho da array menos o valor i menos 1.. por exemplo para i=3:
    o j vai ser 3, a.length=a.length-4, ou seja, a array tendo 6 elementos passa a ficar reduzida a 2, enquato que o j ja vai no 4 (j=3) elemento.. nao sei se me estou a fazer entender..
     
  10. Baderous

    Baderous Banido

    Isso serve para restringir as posições do array àquelas que ainda não se encontram ordenadas (em cada iteração), porque no fim da 1ª iteração, o maior valor fica na última posição, no fim da 2ª, o 2º maior valor fica na penúltima posição, etc, logo, não vale a pena estar a percorrer o array todo até ao fim em cada iteração, porque a parte do fim começa a ficar ordenada, não é preciso mexer nela. O array vai sendo ordenado do fim para o princípio.
     
  11. kabalo

    kabalo Suspenso

    hmm.. ok entao.. bem.. mais uma vez obrigado.. mais uma coisa.. ninguem me respondeu a minha outra duvida deste post.. vou postar outra vez, podem ter-se esquecido ou assim:

     
  12. E porque não

    for(int i = 0; i < array.size();i++) ? :P

    É tudo uma questão de habito
     
  13. kabalo

    kabalo Suspenso

    eu sempre fiz assim.. sempre me ensinaram a fazer como disses-te Sparta..
     
  14. É como digo, tudo vai como as pessoas aprenderam, tanto pode ser assim:
    for(int i = 0; i < array.size();i++)
    ou
    for(int i = 0; i <= array.size()-1;i++)

    Cada qual usa o que lhe der mais jeito no raciocínio lógico.
     
    Última edição: 24 de Janeiro de 2009
  15. kabalo

    kabalo Suspenso

    ou entao simplesmente assim:
    for(int i=1;i<=array.size();i++)
    ja fiz varias vezes assim.
     
  16. d3baser

    d3baser Power Member

    Acho um bocado estranho isso não explodir... Assim estás a saltar a primeira posição do array, e ele pode aceder a uma posição que não existe.
     
  17. blueomega

    blueomega Power Member

    isso da erro, num array de tamanho 10, tem posições da 0 a 9, ai arrancas na 1 até a 10
     
  18. kabalo

    kabalo Suspenso

    fiz-me explicar mal.. eu tava a dizer maneiras k ja usei de utilizar o ciclo for (esta ultima maneira nao se aplica as arrays).. tava-me a referir quando é pra fazer prints e assim :)..
     
  19. AdaXi

    AdaXi Power Member

    Código:
    static void permuta(int a, int b)
    {
        int c;
        c=b;
        a=c;
        b=a;
    }
    Se me lembro bem, em java este método não faz nada, é inútil, as variáveis a e b são cópias das variáveis com que chamaste o método, logo as variáveis originais não são permutadas.

    Se bem me lembro o Bubblesort é uma das maneiras menos eficazes para ordenar um array.

    Para a tua duvida do return tens várias soluções :


    1. Crias um objecto com esses 3 variáveis, e no final do metodo fazes o return desse objecto que contem as 3 variaveis.
    2. Declaras as variáveis como sendo variáveis globais.
    O mais facil neste caso é criares uma variavel global, fiz te aqui um exemplo de um programa que usa uma variavel global :

    Código:
    class Main{
    
        static int aMinhaVariavelGlobal;
    
        public static void main(String[] args){
            aMinhaVariavelGlobal = 0;
            System.out.println(aMinhaVariavelGlobal);
            increment();
            System.out.println(aMinhaVariavelGlobal);
        }
    
        public static void increment(){
            aMinhaVariavelGlobal++;    
        }
    
    }
    O resultado deste programa é :

    Código:
    0
    1
     
  20. kabalo

    kabalo Suspenso

    pois.. ao fazer isso elas simplesmente mantinham a mesma posição..


    ate podia fazer isso mas os profs nos exames colocam la mesmo a vista a dizer "Tenha em consideração que o uso de variaveis globais será fortemente penalizador."


    podes dar-me um exemplo deste metodo? é que é o unica solução que me resta..

    obrigado:)
     

Partilhar esta Página