2014-09-02 1 views
-3
class Insertionsort 
{ 

int A[] = {5,2,4,6,1,3}; 

void insertionSort() 
{ 

    for(int j=2;j<A.length;j++) 
    { 
    int key = A[j]; 
    int i = j-1; 
     while(i>0 && A[i]>key) 
     { 
      A[i+1]=A[i]; 
      i=i-1; 
     } 
     A[i+1]=key; 
    } 

    for(int j = 0;j<=A.length;j++) 
    { 
    System.out.println(A[j]); 
    } 


} 

public static void main(String args[]) 
{ 

Insertionsort is = new Insertionsort(); 

is.insertionSort(); 

} 

} 

Проблема:Индекс вне границ исключений в Java, в случае вставки Сортировка

Выходной сигнал этого 5 1 2 3 4 6 вместо 1 2 3 4 5 6

Что делать?

+1

Try отладчик. Помогает. – talex

+0

Проблема в доступе к массиву '0' - это индекс законного массива. – talex

ответ

1

Это вызывает ошибку:

for(int j = 0;j<=A.length;j++) 
    System.out.println(A[j]); 

Макс индекс массива length - 1 так изменить его на:

for(int j = 0;j<A.length;j++) 
    System.out.println(A[j]); 

еще лучше, почему бы не использовать расширенную for? Таким образом, вы не делаете такого рода ошибку:

for(int a : A) 
    System.out.println(a); 

Назад к вашему алгоритму:

Начиная с j=2 вы выходите из вашего первого элемента так изменить его j=1.
Кроме того, ваш внутренний цикл не должен идти до i>=0 еще вы также оставить из 0-й элемента (индекс массива 0 на основе):

for (int j = 1; j < A.length; j++) { 
    int key = A[j]; 
    int i = j - 1; 
    while (i >= 0 && A[i] > key) { 
     A[i + 1] = A[i]; 
     i = i - 1; 
    } 
    A[i + 1] = key; 
} 

Это напечатает 1 2 3 4 5 6 (в новых линиях, так как println() используется).

0

for(int j = 0;j<=A.length;j++)

изменение j<A.length, чтобы сделать ваш OutOfBounds Exception уйти.

также другие ваши петли имеют неправильное начало/конец условие

for(int j=2;j<A.length;j++) должен начинаться j=1 и while(i>0 && A[i]>key) должны иметь i>=0 или первый элемент массива будет пропущен в своем роде (5).

1

Если вы хотите отсортировать массив, вам просто нужно использовать Sort() из класса Arrays.

Arrays.sort(yourArray);

+0

Этот метод не использует 'insertion sort', но, как указано в [документации] (http://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#sort-int:A -) 'Double-Pivot Quicksort'. Хотя в реальном мире ваш ответ был бы очень приветствуем, я боюсь, что учитель OPs не может принять ваше решение. – Pshemo

0

В вашей сортировочного цикла инициализации j = 2, а затем получить номер из массива с int key = A[j]; поэтому первое число в массиве вы пытаетесь сортировки индекса 2. Так как первый элемент в массиве имеет те индекс 0, вы оставляете 5 и 2 при сортировке.Изменение цикла для

for(int j = 0; j < A.length(); j++){ 
    int key = A[j]; 
    int i = j-1; 
    .... 
-1

класса {сортировка вставками

INT A [] = {5,2,4,6,1,3};

пустоты сортировка вставками() {

for(int j=1;j<A.length;j++) 
{ 
int key = A[j]; 
int i = j-1; 
    while(i>=0 && A[i]>key) 
    { 
     A[i+1]=A[i]; 
     i=i-1; 
    } 
    A[i+1]=key; 
} 

for(int j = 0;j<A.length;j++) 
{ 
System.out.print(A[j] + " "); 
} 

}

государственной статической силы основных (String арг []) {

= является сортировка вставками новая сортировка вставками();

is.insertionSort();

}

}

Смежные вопросы