【问题标题】:Random array sorting (1,000,000)随机数组排序 (1,000,000)
【发布时间】:2017-03-11 04:10:39
【问题描述】:

我一直在解决这个问题:

创建一个包含 10 个随机整数的数组、一个包含 1,000 个随机整数的数组以及一个包含一百万 (1,000,000) 个随机整数的数组。 对于每个数组: 显示数组的前十个元素。 调用数组的选择排序。 显示排序数组的前十个元素。

到目前为止,这是我的代码:

public class Lab_10_3 {

    public static void main(String[] args) {

        int myRandomArray1[] = new int[10];

        int myRandomArray2[] = new int[1000];

        int myRandomArray3[] = new int[1000000];

        count(myRandomArray1);
        printOriginal(myRandomArray1);
        selectionSort(myRandomArray1);
        printArray(myRandomArray1);

        count(myRandomArray2);
        printOriginal(myRandomArray2);
        selectionSort(myRandomArray2);
        printArray(myRandomArray2);

        count(myRandomArray3);
        printOriginal(myRandomArray3);
        selectionSort(myRandomArray3);
        printArray(myRandomArray3);

    }

    public static void count(int[] value) {
        System.out.println("The original order is: ");
        for (int i = 0; i < 10; i++) {
            value[i] = (int) (Math.random() * 10);
        }

    }

    public static void selectionSort(int[] array) {
        int startScan, index, minIndex, minValue;
        for (startScan = 0; startScan < (array.length - 1); startScan++) {
            minIndex = startScan;
            minValue = array[startScan];
            for (index = startScan + 1; index < array.length; index++) {
                if (array[index] < minValue) {
                    minValue = array[index];
                    minIndex = index;
                }
            }
            array[minIndex] = array[startScan];
            array[startScan] = minValue;
        }

    }

    public static void printArray(int[] value) {
        System.out.println("The sorted values are:");
        for (int i = 0; i < 10; i++)
            System.out.print(value[i] + " ");
            System.out.println();
    }

    public static void printOriginal(int[] value) {
        for (int j = 0; j < 10; j++) {
            System.out.println(value[j]);
        }

    }

}

由于某种原因,我的 randomArray3 (1,000,000) 不会打印它的排序值,我不知道为什么......(我对 Java 还是很陌生,我真的很想知道如何以及为什么这样做不工作,所以我可以纠正自己并学习。)

提前致谢!

【问题讨论】:

  • 它“不会打印”是怎么回事?程序会崩溃吗?你有堆栈跟踪吗?还是只是默默地失败了?
  • 不是不会打印。你的排序很慢,需要很长时间。放一些日志语句来验证。
  • 选择排序是 O(n^2),因此程序更有可能只需要很长时间才能运行 1,000,000,000,000 次操作。我的建议:不要使用选择排序,但如果你需要某种学校作业,不要让它对一百万个项目进行排序。
  • 您只需要在数组中插入十个值!其他的都是0。而count 是该方法的糟糕名称。
  • 和一百万 (1,000,000) 个随机整数的数组,这不是真的,对于您的 count 方法,您只需初始化前 10 个变量,因此您的排序长度应该是10

标签: java arrays sorting random


【解决方案1】:

运行代码后,我认为问题在于对一百万个整数运行 O(n^2) 选择排序需要很长时间。该程序需要永远终止。

用内置的(并且非常高效)Arrays.sort 替换您的排序算法,程序几乎立即终止:

import java.util.Arrays;
public class Lab_10_3 {
    public static void main(String[] args) {

        ...

        count(myRandomArray3);
        printOriginal(myRandomArray3);
        Arrays.sort(myRandomArray3);
        printArray(myRandomArray3);
    }
...
}

【讨论】:

  • 可能不会永远。也许几个月。
  • 问题陈述中特别提到了选择排序。但是,我想知道目标是否是显示 10 个最小的元素并使用快速选择(而不是选择排序),这对于随机数据应该没问题。再说一次,如果只需要对 10 个最小的元素进行排序,这可以通过 10 个元素的工作数组和对大数组的单次遍历来完成。
  • @rcgldr 或者您可以迭代限制选择排序。如果他们让你在前一个中执行选择排序之类的操作,那么这作为一个练习是有意义的。
【解决方案2】:

选择排序复杂度为 O(n^2)。 这意味着在最坏的情况下,对 1_000_000 个数字进行排序可能需要 (constant * 1_000_000^2) 次操作。这是一个巨大的数字。 selectionSort(myRandomArray3); 不会很快终止。

【讨论】:

    【解决方案3】:
    1. 对于短数组,插入排序通常优于选择排序。

    2. 对于大型数组,请使用快速排序、堆排序或合并排序。

    学习如何编写这些方法很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 2013-04-05
      相关资源
      最近更新 更多