2013-09-14 4 views
-1

Моя сортировка вставками Программа не показывает правильный результат: '(Ошибка со вставкой Сортировка

Arry является: 5 2 6 1 3

Результат будет: 1 2 3 5 6

Но не . Отображение Result

кодекс:

public class insertionSort 
{ 
    public static void main(String[] args) 
    { 
     int data[] ={5,2,6,1,3}; 
     for(int j = 2; j <data.length; j++) 
     { 
      int key = data[j]; 
      int i = j - 1; 
      while(i > 0 && data[i] > key) 
      { 
       data[i + 1] = data[i]; 
       i=i-1; 
      } 

      data[i + 1] = key; 
      System.out.print(data[j]+" "); 


     } 
    } 
} 
+0

что ваш результат? – Metalhead1247

+0

Мой результат: 6 6 6 – user2779836

+0

Это отличная возможность использовать отладчик IDE и входить в код, чтобы понять, почему он не делает то, что вы ожидаете. Это необходимый навык. – Kon

ответ

1

Попробуйте

public class insertionSort 
{ 
public static void main(String[] args) 
{ 
    int data[] ={5,2,6,1,3}; 
    for(int j = 1; j <data.length; j++) 
    { 
     int key = data[j]; 
     int i = j - 1; 
     while(i >= 0 && data[i] > key) 
     { 
      data[i + 1] = data[i]; 
      i=i-1; 
     } 

     data[i + 1] = key; 


     System.out.print(data[j]+" "); 
    } 

} 
} 
0

Попробуйте так:

Начало основной for-loop с j = 1, и сделать состояние в то время цикла i>=0

import java.util.Arrays; 

public class insertionSort { 
    public static void main(String[] args) { 
     int data[] = { 5, 2, 6, 1, 3 }; 
     for (int j = 1; j < data.length; j++) { 
      int key = data[j]; 
      int i = j - 1; 
      while (i >= 0 && data[i] > key) { 
       data[i + 1] = data[i]; 
       i = i - 1; 
      } 

      data[i + 1] = key; 

     } 
     System.out.println(Arrays.toString(data)); 
     // It prints [1, 2, 3, 5, 6] 
    } 
} 
+0

tq дорогой для вашего ans – user2779836

+0

Вы должны запустить его из 'j = 1', чтобы сделать итерацию по первому элементу массива – fujy

+0

tq мой друг: p – user2779836

0

Вы можете создать отдельный класс для этой проблемы.
И действительно на этом классе этот объектив.

Как этот:

public class InsertionSorter { 
    private int[] a; 

    /** 
    * Constructs an insertion sorter. 
    * @param anArray the array to sort 
    */ 
    public InsertionSorter(int[] anArray) { 
     a = anArray; 
    } 

    /** 
    * Sorts the array managed by this insertion sorter 
    */ 
    public void sort() { 
     for (int i = 1; i < a.length; i++) { 
      int next = a[i]; 

      // Move all larger elements up 
      int j = i; 
      while (j > 0 && a[j - 1] > next) { 
       a[j] = a[j - 1]; 
       j--; 
      } 

      // Insert the element 
      a[j] = next; 
     } 
    } 
} 

Или использовать только статический метод с аргументом массива для существующего класса.

0

Среди прочего, похоже, что основная проблема заключается в том, что вы пытаетесь распечатать элементы массива , а вы его сортируете. Давайте посмотрит на пару итераций вашего цикла, чтобы увидеть, что происходит:

j = 2; data = { 5, 2, 6, 1, 3 } 
    key = data[2] = 6 
    i = j - 1 ==> i = 2 - 1 = 1 
    data[i] = 2 < key = 6 <-- while loop does nothing 
    data[i+1] = data[2] = key = 6 
    data[j] = 6 

j = 3; data = { 5, 2, 6, 1, 3 } 
    key = data[2] = 1 
    i = j - 1 ==> i = 3 - 1 = 2 
    data[i] = 6 > key = 1 
     data[3] = data[2] ==> data[3] = 6 
     i = i - 1 ==> i = 1 
    data[i] = 2 > key = 1 
     data[2] = data[1] ==> data[2] = 2 
     i = i - 1 ==> i = 0 
    i <= 0 <-- while loop stops 
    data[i+1] = data[0] = key = 1 
    data[j] = 6 

data = { 5, 1, 2, 6, 3 } 

В английском языке, что происходит это сортировка вставки держит максимальный элемент (6) в указательном цикле у, потому что это как сортировка вставки работает. Таким образом, каждая итерация цикла вы просто распечатываете текущий максимальный элемент списка, который в этом случае всегда 6. Вы также начинаете свой внешний цикл с неправильного индекса (вы должны начинать с 1, а не 2, почему вы начали с 2 ?). Вы также не позволяете вашему внутреннему циклу смотреть на первый элемент массива.

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

public class insertionSort 
{ 
    public static void main(String[] args) 
    { 
     int data[] = { 5, 2, 6, 1, 3 }; 
     for(int j = 1; j < data.length; ++j) 
     { 
      int key = data[j]; 
      int i = j - 1; 
      while(i >= 0 && data[i] > key) 
      { 
       data[i + 1] = data[i]; 
       --i; 
      } 

      data[i + 1] = key; 
     } 

     for(int k = 0; k < data.length; ++k) 
     { 
      System.out.print(data[k] + " "); 
     } 
    } 
} 
Смежные вопросы