duvida

duvida

por Marcel F. Fernandes -
Número de respostas: 3

no momento de executar o código abaixo ocorre o seguinte erro:

Ordenação o=new Ordenação();
> int[]v={2,1,6,5}
> o. ordenaçãoPorBolha(v)
ArrayIndexOutOfBoundsException: 4
  at Ordenação.ordenaçãoPorBolha(Ordenação.java:39)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  at java.lang.reflect.Method.invoke(Unknown Source)

 //ordenação

class Ordenação
{
  void ordenaçãoPorSeleção(int[]v)
  {
    int inicio=0,temp;
    int indiceMinimo;
    int indice;
    for(inicio=0;inicio<v.length;inicio=inicio+1)
    {
      //acha menor elemento entre inicio e v.length-1
      for( indiceMinimo=inicio, indice=inicio+1;indice<v.length;indice=indice+1)
        {
              if(v[indice]<v[indiceMinimo])
                  indiceMinimo=indice;
     
             temp=v[inicio];
             v[inicio]=v[indiceMinimo];//troca o menor elemento com o elemento do inicio
             v[indiceMinimo]=temp;
     
        }
    }
  }
 
   void ordenaçãoPorBolha(int[]v)
   {
     int temp;
     boolean houveTrocas;
     //repete enquanto houver trocas
    
     do
     {
       houveTrocas=false;
       //percorre o vetor do inicio ao fim
       //testando se v[i]<= v[i+1]
      
       for(int i=0;i<v.length;i=i+1)
         if(v[i]>v[i+1])
       {
         //troca os 2 de lugar
        
         temp=v[i];
         v[i]=v[i+1];
         v[i+1]=temp;
         houveTrocas=true;
       }
     }while(houveTrocas);
   }
}
          
        
        
  do que se trata?

obrigado.    
        
        
        
  
 

Em resposta à Marcel F. Fernandes

Re: duvida

por Ariane Haselmann -
Olá Marcel, acabei de ter o mesmo problema que você enquanto fazia o bubble aqui!

O problema é que ele está tentando acessar alguma posição que não existe: "ArrayIndexOutOfBoundsException:4"

O problema está aqui:

for(int i=0;i<v.length-1;i=i+1)

/* ele deve ir até v.length-1 */


Em resposta à Marcel F. Fernandes

Re: duvida

por Marcelo Queiroz -
Oooooooooooooooooops! Falha minha! No trecho do "Bolha":

for (int i=0;i<v.length-1;i=i+1)
if (v[i]>v[i+1])
{
//troca os 2 de lugar
temp=v[i];
v[i]=v[i+1];
v[i+1]=temp;
houveTrocas=true;
}

o índice i só pode ir até v.length-2 (condição i<v.length-1), pois o "if" vai acessar o v[i+1] na comparação, ou seja, i+1 também tem que ser um índice válido (i+1<v.length <==> i<v.length-1).

Obrigado pelo alerta!

Abraços.