Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么选择排序比冒泡排序快?_Java_Arrays_Sorting_Bubble Sort_Selection Sort - Fatal编程技术网

Java 为什么选择排序比冒泡排序快?

Java 为什么选择排序比冒泡排序快?,java,arrays,sorting,bubble-sort,selection-sort,Java,Arrays,Sorting,Bubble Sort,Selection Sort,我使用Java进行了一个实验,以确定哪种排序方法的冒泡或选择运行时更快。程序提示用户输入一个数字n,该数字是数组中要排序的项目数。然后,它创建并排序500个这种大小的不同数组,并对运行时间进行计时,以获得使用这两种排序方法进行排序的平均时间。我使用500、1000和2500作为n的测试输入。我下面的结果显示,选择排序比冒泡排序运行得更快,但这两种算法的时间复杂度都是^2,那么为什么选择排序运行得更快呢 TimeBubbleSort类 泡泡糖类 TimeSelectionSort类 选择分类 使用

我使用Java进行了一个实验,以确定哪种排序方法的冒泡或选择运行时更快。程序提示用户输入一个数字n,该数字是数组中要排序的项目数。然后,它创建并排序500个这种大小的不同数组,并对运行时间进行计时,以获得使用这两种排序方法进行排序的平均时间。我使用500、1000和2500作为n的测试输入。我下面的结果显示,选择排序比冒泡排序运行得更快,但这两种算法的时间复杂度都是^2,那么为什么选择排序运行得更快呢

TimeBubbleSort类

泡泡糖类

TimeSelectionSort类

选择分类

使用气泡排序的结果

数组大小为500:耗时284979纳秒

阵列大小为1000:耗时960067纳秒

2500的阵列大小:花费7448865纳秒

使用选择排序的结果

阵列大小为500:耗时107035纳秒

数组大小为100:耗时342464纳秒


2500的数组大小:花费1880215纳秒

首先,对比系统时间不是分析两种算法时间复杂性的正确方法,因为请记住,您的程序不是系统上运行的唯一程序。因此,即使算法和输入相同,两个运行时间也可能完全不同

现在来看看你的答案,与选择排序相比,冒泡排序有更多的交换次数,在选择排序中,我们只在每个迭代的最后一步交换。所以这可能是原因


两种算法具有相同的时间复杂度,这并不意味着它们的运行时间是相同的。首先,对它们的时间复杂度进行了近似计算,这是贡献最大的最大因素。在上述两种情况下,最大的因子都是n^2,但还有其他较小的n和常数的幂次,这将产生差异。

当您在这里使用系统计时器时,您是否进行了足够的试验,我认为这不是罪魁祸首。我也很难相信掉期交易花费了总时间的近三分之二,这是Brij Raj Kishore正确回答所需时间的三分之二

虽然您的循环结构并不完全相同,但它们都运行了大约n^2/2次,因此也不会有太大的差异


因此,我认为应该进行更多的挖掘。我不知道你的系统上有什么样的分析器,但除非有人在这里找到什么大东西,否则这将是我的下一步。查看例程实际花费时间的位置。

这不是一个准确的基准:如果两个算法都在^2上,那么它们的运行时间并不相同。一方面,On^2中固有的渐近比例常数会因算法及其实现细节的不同而有所不同。哇,这可以追溯到上世纪80年代教人们如何用COBOL编写选择排序的记忆。虽然使用系统计时器不是一个好的实践,但他做了500次,这应该是平均值,我就是这么说的。此外,还有许多进程正在运行,它们的调度和其他因素将永远不会影响运行时间same@KevinAnderson没有注意到他的终止条件是n-i。此处的比较数量大致相同。@KevinAnderson气泡排序中的比较也将减少。我们不会一直到最后,在每次排序时冒泡排序的情况下,我们不会考虑元素的不同之处在于,在升序不减排序的情况下,我们将开始忽略选择排序中的前几个元素,而在冒泡排序的情况下,我们将剩下最后几个元素。我希望你完全明白这里少数人的意思
public class TimeBubbleSort {
    public static void main(String[] args) {

        System.out.print("Enter a number of items in array: ");
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();

        long start_time = 0;
        long end_time = 0;
        long running_time = 0;
        long final_time = 0;
        BubbleSort bubbleSort = new BubbleSort();

        for(int i = 0; i < 500; i++) {
            int[] array = new int[n];
            for(int j = 0; j < array.length; j++) {
                array[j] = (int)(Math.random() * n) + 1;
            }
            start_time = System.nanoTime();
            bubbleSort.bubbleSort(array);
            end_time = System.nanoTime();
            running_time = end_time - start_time;
            final_time = final_time + running_time;
        }
        System.out.println("The average time of each array took " + 
(final_time / 500) + " nanoseconds");
    }
}
public class BubbleSort {

    void bubbleSort(int[] arr) {
        int n = arr.length;
        int temp = 0;
        for (int i = 0; i < n; i++)
            for (int j = 1; j < (n - i); j++)
                if (arr[j - 1] > arr[j]) {
                    temp = arr[j - 1];
                    arr[j - 1] = arr[j];
                    arr[j] = temp;
                }
    }

    void printArray(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; ++i)
            System.out.print(arr[i] + " ");
        System.out.println();
    }
}
public class TimeBubbleSort {
    public static void main(String[] args) {

        System.out.print("Enter a number of items in array: ");
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();

        long start_time = 0;
        long end_time = 0;
        long running_time = 0;
        long final_time = 0;
        SelectionSort selectionSort = new SelectionSort();

        for(int i = 0; i < 500; i++) {
            int[] array = new int[n];
            for(int j = 0; j < array.length; j++) {
                array[j] = (int)(Math.random() * n) + 1;
            }
            start_time = System.nanoTime();
            selectionSort.selectionSort(array);
            end_time = System.nanoTime();
            running_time = end_time - start_time;
            final_time = final_time + running_time;
        }
        System.out.println("The average time of each array took " + 
(final_time / 500) + " nanoseconds");
    }
}
public class SelectionSort {
    void sort(int arr[]) {
        int n = arr.length;

        for (int i = 0; i < n - 1; i++) {
            int min_idx = i;
            for (int j = i + 1; j < n; j++)
                if (arr[j] < arr[min_idx])
                    min_idx = j;

            int temp = arr[min_idx];
            arr[min_idx] = arr[i];
            arr[i] = temp;
        }
    }

    void printArray(int arr[]) {
        int n = arr.length;
        for (int i=0; i<n; ++i)
            System.out.print(arr[i]+" ");
        System.out.println();
    }
}