java - 为什么使用 arraylist 实现的插入排序没有输出也没有错误?

标签 java sorting arraylist

我希望任何人都可以帮助我编写以下 Java 代码,因为即使它没有显示任何错误,它也没有给出数组作为输出: 我正在尝试实现插入排序。我制作了 2 个包和类;一个主要的和一个 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);
            }
        }
    }
}

我得到的输出只是没有数组的文本。希望有人能帮忙!请记住我是新手。提前谢谢你:)

最佳答案

这会将 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 的状态,因此您不应该对其成员使用 static 修饰符应该关联到InsertionSort一个 实例。 所以用实例修饰符替换静态修饰符。

关于java - 为什么使用 arraylist 实现的插入排序没有输出也没有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45804846/

相关文章:

java - JUnit @Test InvalidStateException

Java - 按步骤对数组进行切片

c - 使用系统和库函数对文件进行排序

在 MATLAB 中将项目分类到容器中

java - 将 ArrayList 制作成 JTable

java - 将值添加到 double[] arraylist

java - 丢弃字符的前导和尾随系列,但保留相同的字符

java - 如何将从串口接收到的字节转换为十六进制?

c# - 在 C# 中对字符串进行排序

java - 尝试读取包裹 ArrayList<Object> 时出现 NullPointerException