【问题标题】:Java Bubblesort AlgorithmJava 冒泡排序算法
【发布时间】:2013-09-04 21:04:20
【问题描述】:

我正在尝试利用暑假来练习更多的 Java,通过学习如何编写算法来变得更好。我有这个问题,我将元素添加到我的 ArrayList 但不知何故,我添加的第一个数字也设置了我想要避免的列表中的位置数。我只希望第 0 个索引包含数字 5。我似乎不知道如何解决这个问题。

public class Algorithms {

private ArrayList<Integer> numbers;

public Algorithms() {

    numbers = new ArrayList<Integer>();
    numbers.add(5);
    numbers.add(4);
    bubblesort();
}

public static void main(String args[]) {
    new Algorithms();
}

public void bubblesort() {

    System.out.println(numbers);
    for (int a = 0; a < numbers.size();) {
        for (int b = 1; b < numbers.size();) {
            int currentNumber = numbers.get(a);
            if (currentNumber > numbers.get(b)) {

                //Collections.swap(numbers, currentNumber, numbers.get(b));

                numbers.set(numbers.get(a), numbers.get(b));
                numbers.set(numbers.get(b), numbers.get(a));

                a++;
                b++;

            } else if (currentNumber < numbers.get(b)) {
                a++;
                b++;
            }
            System.out.println(numbers);
        }
    }
}
}

【问题讨论】:

  • 你认为numbers.set(numbers.get(a), numbers.get(b));应该做什么?你看过ArrayList API 吗?

标签: java algorithm arraylist bubble-sort


【解决方案1】:

您没有正确交换元素。而不是

numbers.set(numbers.get(a), numbers.get(b));
numbers.set(numbers.get(b), numbers.get(a));

应该是

int temp = numbers.get(a);
numbers.set(a, numbers.get(b));
numbers.set(b, temp);

【讨论】:

  • 对,现在一切正常,但是当我选择向列表中添加更多元素时,它对 i 进行排序,但是以 indexoutofBounds 异常为代价,我知道这与临时变量 int currentNumber 有关= 数字.get(a);指向列表中不存在的下一个索引。如果您能帮我找到解决方法,我似乎找不到解决该问题的方法。
【解决方案2】:

以下两条语句:

numbers.set(numbers.get(a), numbers.get(b));
numbers.set(numbers.get(b), numbers.get(a));

没有执行交换。 List#set(int, E) 方法的第一个参数是列表中的索引,您希望在其中设置作为第二个参数传递的值。您需要使用temp 变量进行交换。

此外,出于同样的原因,交换不适用于您的评论行。 Collections#swap 方法采用索引进行交换。所以,只需改变:

Collections.swap(numbers, currentNumber, numbers.get(b));

到:

Collections.swap(numbers, a, b);

为了所有神圣的爱,请don't call method from inside a constructor。从构造函数内部删除方法调用,并将其移至 main 方法,如下所示:

Algorithms algo = new Algorithms();
algo.bubbleSort()

【讨论】:

  • 哦,这就是我可以直接从主方法调用方法的方式。干杯:)
猜你喜欢
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 2018-04-25
  • 2013-11-02
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 2015-01-17
相关资源
最近更新 更多