随机化ListArray上的Java Bubble排序

时间:2016-05-23 06:07:44

标签: java arraylist bubble-sort

我正在练习Java并且可以在int []数组上进行冒泡排序。我看到我是否可以为自己制作一个更难的例子,所以我在每个元素中创建了一个随机长度的ArrayList。

问题是当完成冒泡排序时,有时在调用bubbleSort2之后不会打印任何内容。由于某种原因,我不能在bubbleSort2方法中使用foreach循环。

如果我对List和ArrayList的使用很好,也请告诉我。

import java.util.ArrayList;
import java.util.List;

public class BubbleSort
{

    public static void main(String[] args)
    {
        List<Integer> myList2 = new ArrayList<Integer>();
        int min = 2;
        int max = 30;
        for (int i=0; i<(int)(Math.random() * ( max - min) + min); i++)
        {
            myList2.add((int)(Math.random() * 100));
        }

        System.out.println("Unsorted list 2");
        for (int element: myList2)
        {
            System.out.print(element + " ");
        }
        System.out.println("");

        System.out.println("Bubble sorted list 2 (BubbleSort2)");
        bubbleSort2(myList2);
        for(int element: myList2)
        {
            System.out.print(element + " ");
        }
    }

    public static void swap2(List<Integer> x, int i, int j)
    {
        Integer temp = x.get(i);
        x.set(i, x.get(j));
        x.set(j, temp);
    }

    public static void bubbleSort2(List<Integer> x)
    {
        int mostRightSwap = x.size() - 1;
        while (mostRightSwap > 0)
        {
            for (int i=0; i<x.size()-1; i++)
            {
                if (x.get(i) > x.get(i + 1))
                {
                    swap2(x, i, i + 1);
                    mostRightSwap = i;
                }
            }
        }
    }

}

更新

我已经弄清楚了我的问题。正如在这里以及其他地方的朋友所指出的,当if条件永远不会满足时,我有时会陷入无限循环。所以一行代码mostRightSwap = 0;添加到伪造if语句之前的while条件,以防if语句不执行。

public static void bubbleSort(List<Integer> x)
    {
        int mostRightSwap = x.size() - 1;
        while (mostRightSwap > 0)
        {
            int right = mostRightSwap;
            mostRightSwap = 0;
            for (int i=0; i<right; i++)
            {
                if (x.get(i) > x.get(i+1))
                {
                    swap2(x, i, i+1);
                    mostRightSwap = i;
                }
            }
        }
    }

3 个答案:

答案 0 :(得分:1)

你的问题基本上是你遇到了无限循环。 你的停止条件是,如果最右边的交换元素不是第一个元素,请尝试对数组进行冒泡。但是现在想象一下像这样的场景,具有以下元素。

[1, 5, 31, 17, 20]。你认为会发生什么?第一个元素永远不会被交换,并且你被困在一个无限循环中,因为你的外部while循环条件永远不会使循环停止,因为第一个元素是最低元素。我宁愿建议一个简单的布尔值来检查是否已经为外部while循环交换了某些内容。

public static void bubbleSort2(List<Integer> x)
{
    boolean swapped = false;
    do
    {
        swapped = false;
        for (int i=0; i<x.size()-1; i++)
        {
            if (x.get(i) > x.get(i + 1))
            {
                swap2(x, i, i + 1);
                swapped = true;
            }
        }
    } while(swapped);
}

答案 1 :(得分:0)

如果您已经在使用列表,为什么不简单地使用Collections上的预定义方法对数据进行排序。

List<Integer> x = new ArrayList();
Collections.sort(x);
Collections.reverse(x);

答案 2 :(得分:0)

这里有几点需要注意。

首先,如果您使用的是Java 8,则可以使用以下方法更轻松地创建随机列表:

Random rand = new Random();
List<Integer> list = rand.ints(rand.nextInt(30) + 2, 1, 100)
   .collect(Collectors.toList());

其次,Collectionsswap方法。

第三,我看不出你的冒泡排序应该如何结束。例如,如果您传递已排序的列表,则mostRightSwap将保持设置为大小-1,并且循环不会退出。