Java冒泡排序算法

时间:2013-09-01 18:40:45

标签: java algorithm arraylist bubble-sort

我试图通过学习如何编写算法来利用夏天来练习更多的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);
        }
    }
}
}

2 个答案:

答案 0 :(得分:3)

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

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);

答案 1 :(得分:1)

以下两个陈述:

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()