2016-11-08 3 views
4

Я пытаюсь вставить 5 чисел за раз, чтобы создать массив в порядке возрастания, но у меня проблема с моим третьим номером и так далее. Тест для вставки: Несколько меньше первого элемента числа больше, чем последний элемент Ряда между первым и последним элементом Рядом уже в массиве Вот мой код до сих пор:Вставка и сортировка по возрастанию

import java.util.Scanner; 
public class InsertInOrder { 

    public static void main(String[] args) { 
    Scanner input=new Scanner(System.in); 
    int [] a=new int[5]; 
    int numberofelements=0; 
    System.out.print("Number to insert: "); 
    int numtoinsert=input.nextInt(); 
    if (numtoinsert!=0) 
    { 
     a[0]=numtoinsert; 
     ++numberofelements; 
     System.out.print("Array is now: "); 
     System.out.println(a[0]); 
    } 
    while(numberofelements<a.length) 
    { 
     System.out.print("Number to insert: "); 
     numtoinsert=input.nextInt(); 
     if ((numtoinsert<a[numberofelements]) || (numtoinsert==a[numberofelements])) 
      { 
       for(int i=0;i<numberofelements;i++) 
       { 
        a[i]=a[i+1]; 
       } 
      } 
    else 
    a[numberofelements]=numtoinsert; 
    numberofelements++; 
    System.out.print("Array is now: "); 
    for(int i=0;i<numberofelements;i++) 
     { 
      System.out.print(a[i]+" "); 
     } 
     System.out.println(); 
    } 
    System.out.print("\nArray is now full"); 
    } 

} 

Мой вывод кода:

Number to insert: 5 
Array is now: 5 
Number to insert: 2 
Array is now: 5 2 
Number to insert: 7 
Array is now: 5 2 7 
Number to insert: 4 
Array is now: 5 2 7 4 
Number to insert: 5 
Array is now: 5 2 7 4 5 

Array is now full 
+0

'numtoinsert <а [numberofelements]' в то время этого теста, 'а [numberofelements] ', поскольку никакое значение не установлено так, равно 0. Это вам проблема. – AxelH

+1

Попробуйте запустить программу с помощью отладчика, чтобы узнать, где это происходит. – Henry

ответ

1

Эта линия:

if ((numtoinsert<a[numberofelements]) || (numtoinsert==a[numberofelements])) 

Проверяет наличие большего или меньшего числа в коде.

Тем не менее, numberofelements в константе в каждой конкретной итерации.

Try зацикливание снова и перебирать все текущие элементы в массиве.

Удачи вам!

EDIT:

Как прокомментировал ниже, начальное условие было указано выше, возможно, на самом деле работает, если массив отсортирован. Сортировка, однако, немного выключена.

Это for петля:

for(int i=0;i<numberofelements;i++) 
      { 
       a[i]=a[i+1]; 
      } 

предполагается перемещать элементы вокруг массива, что делает его отсортированный один.

Но на практике он просто перемещает все элементы на одно место назад, а удаляет первый элемент.

Попробуйте добавить новое значение в нужное место в массиве, не удаляя другие значения. A bubble sort или any other sorting algorithm сделают трюк.

+1

@xenteros hmmm ... почему? На самом деле это ответ на проблему OP ... – MordechayS

+0

После else есть инкремент (да, отступ не помогает увидеть его) – AxelH

+0

Я получаю приращение, но он все еще оценивает условие if, которое решает, следует ли изменять положение в массиве ** только ** в одном месте в массиве. – MordechayS

0

Вы логично перемещать значения через массив не так уж и хороши.

if ((numtoinsert<a[numberofelements]) || (numtoinsert==a[numberofelements])) 
{ 
    for(int i=0;i<numberofelements;i++) 
    { 
      a[i]=a[i+1]; 
    } 
} 

Во-первых, удалить второе условие, нет необходимости перехода значения, если есть такие же;) [5; 5] и [5; 5] являются одинаковыми;)

Тогда есть две проблемы здесь:

  1. Вы двигаетесь значения в неправильном направлении он
  2. Вы начинаете в начале, но новое значение будет вставлено где-нибудь еще

Вот что вы должны сделать:

Если новое значение (A) меньше предыдущего значения (B).Затем вам нужно переместить B в следующую ячейку массива. Затем еще раз проверьте значение до этого.

Вот это в коде:

if (numtoinsert < a[numberofelements-1]) { //If the PREVIOUS value is bigger 
    int i = numberofelements; //start at the current index 
    //then read from right to left 
    // while not at the beginning (i > 0) 
    // AND the value is smaller than the value at the current position. 
    while(i > 0 && numtoinsert < a[i-1]) { 
     a[i] = a[i-1]; //Set the left value to the right. 
     i--; //Decrement the index 
    } 
    a[i] = numtoinsert; //Then add the new value to the 
} 

Это полный код правильно отступом

public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     int[] a = new int[5]; 
     int numberofelements = 0; 
     System.out.print("Number to insert: "); 
     int numtoinsert = input.nextInt(); 
     if (numtoinsert != 0) { 
      a[0] = numtoinsert; 
      ++numberofelements; 
      System.out.print("Array is now: "); 
      System.out.println(a[0]); 
     } 
     while (numberofelements < a.length) { 
      System.out.print("Number to insert: "); 
      numtoinsert = input.nextInt(); 
      if (numtoinsert <= a[numberofelements-1]) { 
       int i = numberofelements; 
       while(i > 0 && numtoinsert < a[i-1]) { 
        a[i] = a[i-1]; 
        i--; 
       } 
       a[i] = numtoinsert; 
      } else { 
       a[numberofelements] = numtoinsert; 
      } 
      numberofelements++; 
      System.out.print("Array is now: "); 
      for (int i = 0; i < numberofelements; i++) { 
       System.out.print(a[i] + " "); 
      } 
      System.out.println(); 
     } 
     System.out.print("\nArray is now full"); 
    } 
Смежные вопросы