我正在为我的编程课做额外的学分。我们正在做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);
}
}
答案 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