排序整数数组(使用我自己的算法) - Java

时间:2012-11-09 20:42:55

标签: java

我正在为我的编程课做额外的学分。我们正在做OOP,这个例子是采用数组并对其进行排序。所有排序代码都将进入add方法。我已经有了一些代码,而且它有点像。如标题中所述,我必须使用我的唯一代码创建自己的算法。如何对列表中从最小到最大的所有整数进行排序? (整数是使用add方法添加的值。)以下是教师给我的说明:

•沿阵列向下走,直到找到新元素的位置。由于列表已经存在 排序你可以继续看元素,直到找到一个至少与那个元素一样大的元素 插入

•向下移动新元素之后的每个元素,即从您停止的元素开始的所有元素 到最后。这将创建一个插槽,您可以在其中放置新元素。请注意订单 您移动它们或者您将覆盖您的数据!

现在,您可以将新元素插入最初停止的位置。所有这些都将进入你的添加方法。

该计划的两个类别:

   private int[] list;
   private int numElements = 0;



   //-------------------------------------------------------------
   // Constructor -- creates an integer list of a given size.
   //-------------------------------------------------------------
   public IntList(int size)
   {
      list = new int[size];
   }
   //------------------------------------------------------------
   // Adds an integer to the list. If the list is full,
   // prints a message and does nothing.
   //------------------------------------------------------------

   public void add(int value)
   {
      if (numElements == list.length){
      System.out.println("Can't add, list is full");
      }
      else
      { 
        list[numElements] = value;
        for(int i = 0; i < numElements; i++){
            //May be I should use a nested loop?
            //for(k = 0; k <)
             if(value < list[i]){
                 list[i+1]= list[i];
                 list[i]=value;
             }
       }
        numElements++;

            }


      }



   //-------------------------------------------------------------
   // Returns a string containing the elements of the list with their
   // indices.
   //-------------------------------------------------------------
   public String toString()
   {
      String returnString = "";
      for (int i=0; i<numElements; i++)
         returnString += i + ": " + list[i] + "\n";
      return returnString;
   }
}

另一堂课:

public class IntListThing {


public static void main(String[] args){

          IntList myList = new IntList(10);
          myList.add(84);
          myList.add(27);
          myList.add(250);
          myList.add(18);
          myList.add(94);
          myList.add(8);
          myList.add(87);
          System.out.println(myList);
       }
    }

5 个答案:

答案 0 :(得分:4)

找到正确的位置,即if(value < list[i]){为真,然后将所有可用元素移至右侧。您只能使用list[i+1]= list[i];移动一个。

即。使用一个小循环:

  for(int j= numElements-1; j>=i; j--){
      list[j+1]= list[j];
  }
  list[i] = value;

请注意:这是概念。请调整指数和条件。

编辑:我提到你需要在元素插入后立即中断。我也纠正了这些条件。这是更新的else块代码。

        list[numElements] = value;
        for(int i = 0; i < numElements; i++){
            //May be I should use a nested loop?
            //for(k = 0; k <)
             if(value < list[i]){
                 for(int j= numElements-1; j>=i; j--){
                      list[j+1]= list[j];
                  }
                  list[i] = value;
                  break;
            }
        }
        numElements++;

答案 1 :(得分:2)

如果您真的想要对您的教授产生影响,请对插入点进行二进制搜索。一旦找到它,退出该循环并输入另一个循环,在那里将所有内容复制到插入点之外的一个位置。

修改

正如@Jan Dvorak在下面尖锐地指出的那样,即使二进制搜索也浪费了CPU时间和编程工作:)

答案 2 :(得分:1)

由于这是家庭作业,许多人不愿意直接给你代码。

您在评论中使用嵌套循环暗示的内容是必要的。这个循环的目标是将list中的每个元素“推回”一个点。一些注意事项:

1)务必检查阵列的边界。如果你的数组是“满”,那么超出限制将导致ArrayOutOfBoundsException

2)注意不要在循环中覆盖任何值。我可以建议从后面开始向前迈进吗?

答案 3 :(得分:0)

试试这个

class IntListThing  {
private int[] list;
private int numElements;

public IntListThing  ( int initial_capacity ) {
    list = new int[initial_capacity>0?initial_capacity:1];
    numElements = 0;
}

public void add(int value)  {
      if (numElements == list.length) list = Arrays.copyOf(list, list.length*2);
      int i = 0;
      for ( i = 0 ; i < numElements ; ++i ) 
          if ( value < list[i] ) break; 
      for ( int k = numElements ; k > i ; --k )
          list[k] = list[k-1];
      list[i] = value;
      ++numElements;
}

public String toString()  {
      String returnString = "";
      for (int i=0; i<numElements; i++)
         returnString += i + ": " + list[i] + "\n";
      return returnString;
   }


}

通过这种方式,您也不必担心阵列变满,并在需要时调整大小。

在Arrays类中,您可以找到各种其他有用的方法。你一定要看一下。你有一个有人建议使用的二进制搜索,但这在这里是非常不合适的,因为在这种方法中你已经具有复制数组的线性复杂性,所以在对数时间内进行搜索的重点是什么。

我希望你能获得额外的荣誉。

如果你想再练习一下,可以尝试制作一个删除方法,在需要节省空间的同时调整数组的大小。如果您需要帮助,请在评论中告诉我。

答案 4 :(得分:0)

经典插入排序的工作原理是将一个元素交换到左边直到它被排序,然后继续移动到下一个元素,只将要移动的元素写到不被覆盖的地方:

- input: array a
- for i from 1 to a.length-1: // the first element is already sorted!
  - temp = a[i];
  - j = i;
  - while (j>0 && a[j-1] < temp):
    - a[j] = a[j-1];
    - j = j-1;
  - endwhile
  - a[j] = temp;
- endfor
- output: a