Java 气泡与选择排序的效率

Java 气泡与选择排序的效率,java,big-o,bubble-sort,selection-sort,Java,Big O,Bubble Sort,Selection Sort,我知道冒泡排序和选择排序的大O值是相同的,(n)^2,但是当我尝试使用大小为1000的数组运行这两个值时,冒泡排序需要962037次交换来对数组进行排序,而选择排序只需要988次交换来对数组进行排序。为什么这些不同?因为复杂性指的是比较的数量,而不是互换的数量。两者都需要O(n^2)比较,但在最坏的情况下,选择排序只需要n-1swaps(O(n)),而bubblesort可能需要多达n*(n-1)/2swaps(O(n^2)) 即使复杂性是指交换的数量——因为符号忽略了常数(一个实际上可能是10

我知道冒泡排序和选择排序的大O值是相同的,(n)^2,但是当我尝试使用大小为1000的数组运行这两个值时,冒泡排序需要962037次交换来对数组进行排序,而选择排序只需要988次交换来对数组进行排序。为什么这些不同?

因为复杂性指的是比较的数量,而不是互换的数量。两者都需要O(n^2)比较,但在最坏的情况下,选择排序只需要
n-1
swaps(O(n)),而bubblesort可能需要多达
n*(n-1)/2
swaps(O(n^2))


即使复杂性是指交换的数量——因为符号忽略了常数(一个实际上可能是
1000*n^2+500*n*log(n)+100*n+10
,而另一个可能是
n^2
),这两个数字仍然可能相差很大

大O表示法提供了无症状成本,但是,忽略了所有附加值和常数。此外,对于小数值的实际比较,您需要查看平均比较数。更具体地说,冒泡排序平均每个条目需要n/4次交换,而选择排序只需要1次,有关更多详细信息,请参见此。比较的次数也取决于初始分布,例如数据是半排序的还是完全随机的。

Eh?这两种算法都是O(n^2),无论您是在计算交换、比较还是一般的运算。@Louis Wasserman:选择排序要求(在最坏的情况下)对每个不在正确位置(O(n))的数字进行一次交换。对于冒泡排序,它取决于实际位置,但对于反向列表,需要n*(n+1)/2次交换(O(n^2))