Java 为什么选择排序比冒泡排序快?
我使用Java进行了一个实验,以确定哪种排序方法的冒泡或选择运行时更快。程序提示用户输入一个数字n,该数字是数组中要排序的项目数。然后,它创建并排序500个这种大小的不同数组,并对运行时间进行计时,以获得使用这两种排序方法进行排序的平均时间。我使用500、1000和2500作为n的测试输入。我下面的结果显示,选择排序比冒泡排序运行得更快,但这两种算法的时间复杂度都是^2,那么为什么选择排序运行得更快呢 TimeBubbleSort类 泡泡糖类 TimeSelectionSort类 选择分类 使用气泡排序的结果 数组大小为500:耗时284979纳秒 阵列大小为1000:耗时960067纳秒 2500的阵列大小:花费7448865纳秒 使用选择排序的结果 阵列大小为500:耗时107035纳秒 数组大小为100:耗时342464纳秒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类 选择分类 使用
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();
}
}