为什么使用arraylist实现插入排序不提供输出且没有错误?

时间:2017-08-21 20:12:07

标签: java sorting arraylist

我希望有人可以帮助我使用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);
            }
        }
    }
}

我得到的输出只是没有数组的文本。希望有人可以帮忙!请记住,我是一个新手。非常感谢您提前:)

2 个答案:

答案 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!
        }
    }
}

我还没有尝试过编译/运行它,所以请告诉我这是否有效。