根据
http://algs4.cs.princeton.edu/21elementary/
"选择排序使用~N 2 / 2比较和N个交换来排序长度为N的数组。"
例如,我在数组中有两个项目
String [] a = {" h"," t"};
我可以假设选择排序使用2 2 / 2 = 2比较和2个交换来排序长度为2的数组吗?
但当我运行这个:
http://algs4.cs.princeton.edu/21elementary/Selection.java.html
它只比较一次。当然,这是常见的,因为唯一要比较的项目是h和t。但我仍然对声明感到困惑。我的实验有问题吗?我是新人。
答案 0 :(得分:2)
选择排序使用大约N ^ 2/2比较和N个交换。
对于精确分析,选择排序使用
N-1 + N-2 + N-3 + ..... 1比较以对长度为N的数组进行排序。
因此,比较的总数=(N-1)*(N)/ 2 = N ^ 2/2-N / 2,其近似等于N ^ 2/2。这是他们写的。
在N为2的示例中,比较= 1 * 2/2 = 1。 交换次数= 1.(N-1)
答案 1 :(得分:0)
符号f(n)~g(n)表示: $$ \ lim_ {n \ to \ infty} \ frac {f(n)} {g(n)} = 1 $$
在这种特殊情况下,您会看到第一个元素与其他$ n - 1 $进行比较,第二个元素与$ n - 2 $进行比较,直到倒数第二个为1.因此,比较次数为:
(n - 1)+(n - 2)+ ... + 1 = n(n - 1)/ 2~n ^ 2/2