Ordenação de arrays

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:
O teu algoritmo parece-me uma típica implementação do Bubblesort. Vê o link para esclareceres dúvidas.
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?
 
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++)
 
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 :)..
 
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..
 
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.
 
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:

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.
 
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++)

E porque não

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

É tudo uma questão de habito
 
É 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:
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 :)..
 
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
 
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.

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


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 :

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."


Crias um objecto com esses 3 variáveis, e no final do metodo fazes o return desse objecto que contem as 3 variaveis.

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

obrigado:)
 
Back
Topo