【问题标题】:Java Bubble sort on randomised ListArray随机 ListArray 上的 Java 冒泡排序
【发布时间】: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&lt;(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


【解决方案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);
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我正在练习冒泡排序的方法。我特意避免使用这样的捷径。
    【解决方案3】:

    这里有几点需要注意。

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

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

    其次,Collections 有一个swap 方法。

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

    【讨论】:

    • 感谢您的帮助。这是构建随机数组的一种有趣方式。像Collections 中的swap 方法这样的快捷方式是我在此练习中想避免的,这样我就可以自己学习基础知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2017-06-17
    • 2015-12-17
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多