我希望有人可以帮助我使用Java中的以下代码,因为即使它没有显示任何错误,它也没有提供数组作为输出: 我正在尝试实现插入排序。我做了两个包和课程;一个主要的和一个InsertionSort。 我使用的代码是:
package main;
import java.util.ArrayList;
import insertionSort.InsertionSort;
public class Main implements Cloneable{
public static void main(String[] args){
ArrayList<Integer> unsortedArray = new ArrayList<Integer>();
unsortedArray.add(8);
unsortedArray.add(7);
unsortedArray.add(6);
unsortedArray.add(5);
unsortedArray.add(4);
unsortedArray.add(0);
unsortedArray.add(2);
InsertionSort sort = new InsertionSort(unsortedArray);
System.out.println("Initial unsorted array: ");
for(int i:InsertionSort.inputArray()){
System.out.print(i + " ");
}
sort.doInsertionSort();
System.out.println("Sorted array after performing insertion sort: ");
for(int i:InsertionSort.inputArray()){
System.out.print(i + " ");
}
}
}
package insertionSort;
import java.util.ArrayList;
public class InsertionSort {
private static ArrayList<Integer> array = new ArrayList<Integer>();
public static ArrayList<Integer> inputArray() {
return array;
}
public InsertionSort(ArrayList<Integer> inputArray){
InsertionSort.array = array;
}
public void doInsertionSort(){
for (int j = 1; j<array.size(); j++){
int key = array.get(j);
int i;
for (i=j-1; i>=0 && array.get(i)> key; i--){
array.set(i+1,array.get(i));
array.set(i+1, key);
}
}
}
}
我得到的输出只是没有数组的文本。希望有人可以帮忙!请记住,我是一个新手。非常感谢您提前:)
答案 0 :(得分:3)
这会将array
变量分配给自己:
public InsertionSort(ArrayList<Integer> inputArray){
InsertionSort.array = array;
}
这应该是:
public InsertionSort(ArrayList<Integer> inputArray){
array = inputArray;
}
此外,你的交换中有一点错误。
array.set(i+1, key);
应在内循环后执行
它将外循环的元素(由key
变量引用)设置在正确的位置
只有在对元素左侧进行排序时才需要这样做,因此在内循环之后。
所以这个:
for (i=j-1; i>=0 && array.get(i)> key; i--){
array.set(i+1,array.get(i));
array.set(i+1, key);
}
应该是:
for (i=j-1; i>=0 && array.get(i)> key; i--){
array.set(i+1,array.get(i));
}
array.set(i+1, key);
作为旁注,您没有正确使用实例和静态修饰符。
您创建了InsertionSort
的实例:
InsertionSort sort = new InsertionSort(unsortedArray);
但构造函数指的是静态字段。
...
private static ArrayList<Integer> array = new ArrayList<Integer>();
public InsertionSort(ArrayList<Integer> inputArray){
InsertionSort.array = array;
}
为什么在这种情况下创建实例?
InsertionSort
具有特定于您传递给的List
的状态,因此您不应对{<1}}修饰符使用与一个相关联的成员 static
的实例。
所以用实例修饰符替换静态修饰符。
答案 1 :(得分:0)
你正试图静态地做事,但你没有做得很对。如果你想这样做,请查看davidxxx的解决方案。如果你不想静态地做。如果你不想静态地做事......
在for循环中,您尝试静态调用InsertionSort方法。您需要使用已创建的InsertionSort对象(排序)。
你的for循环应该是这样的......
for(int i:sort.inputArray())
此外,您的InsertionSort构造函数不对。它应该看起来像......
public InsertionSort(ArrayList<Integer> inputArray){
InsertionSort.array = inputArray;
}
您的排序方法中还存在一个小问题。在内部循环中,您正确地将索引i + 1的值设置为索引i处的值。但是,您将索引i + 1设置为等于&#34;键&#34; value,确保您的数组永远不会更改。这是正确的算法。
public void doInsertionSort(){
for (int j = 1; j<array.size(); j++){
int key = array.get(j);
for (int i=j-1; i>=0 && array.get(i)> key; i--){ //I moved i's declaration here for simplicity.
array.set(i+1,array.get(i));
array.set(i, key); //This is the line that I changed!
}
}
}
我还没有尝试过编译/运行它,所以请告诉我这是否有效。