我正在练习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;
}
}
}
}
答案 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());
其次,Collections
有swap
方法。
第三,我看不出你的冒泡排序应该如何结束。例如,如果您传递已排序的列表,则mostRightSwap
将保持设置为大小-1,并且循环不会退出。