按升序插入和排序

时间:2016-11-08 07:22:20

标签: java arrays

我试图一次插入5个数字以按升序创建数组,但我的第3个数字有问题,等等。测试是插入: 比第一个元素小的数字 比最后一个元素大的数字 第一个和最后一个元素之间的数字 数组中已有的数字 到目前为止,这是我的代码:

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

2 个答案:

答案 0 :(得分:1)

这一行:

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

检查代码中是否有更大/更小的数字。

尽管如此,numberofelements在每个特定的迭代中都是常量。

尝试再次循环 并遍历所有数组中的当前元素。

祝你好运!

修改

如下所述,上面提到的初始条件可能确实有效,如果数组已排序。然而,排序有点过时了。

这个for循环:

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

应该在数组中移动元素,使其成为有序元素。

但实际上,它会将所有元素向后移动一个位置,并删除第一个元素。

尝试将新值添加到数组中的正确位置,而不删除其他值。 bubble sortany other sorting algorithm可以解决问题。

答案 1 :(得分: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. 您从头开始,但新值将插入其他地方
  3. 这是你应该做的:

    如果新值(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");
        }