【发布时间】:2016-09-19 21:35:16
【问题描述】:
我正在练习 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;
}
}
}
}
【问题讨论】:
-
使用
for (int i=0; i<(int)(Math.random() * ( max - min) + min); i++)每次迭代都需要一个新的随机值。您需要将随机数存储在一个变量中,然后将i与该变量进行比较。 -
“我不能在 bubbleSort2 方法中使用 foreach 循环”为什么不呢?
-
要真正挑战自己,您当然应该在解决当前问题后将其设为 Generic-docs.oracle.com/javase/tutorial/java/generics/types.html
-
@glglgl 我认为您不能或不应该使用 foreach 进行排序,因为每次循环都会更改数组,并且您不希望程序每次遍历整个数组。随着数组变得更加有序,每次传递都应该变得更短。
-
@NathanWhite 我去看看 b0ss。
标签: java arraylist bubble-sort