选择排序的算法效率

能解决排序问题的算法不止选择排序一个。那么,当有多个算法都可以解决同一个问题时,我们该如何选择呢?

在算法的评判上,考量的标准也各有不同。

比如,简单的算法对人来说易于理解,也容易被写成程序,而在运行过程中不需要耗费太多空间资源的算法,就十分适用于内存小的计算机。
不过,一般来说我们最为重视的是算法的运行时间,即从输入数据到输出结果这个过程所花费的时间。

使用全排列算法进行排序
为了让大家体会一下低效率算法的效果,这里来看看下面这个排序算法。
① 生成一个由n个数字构成的数列(不和前面生成的数列重复)
② 如果①中生成的数列按从小到大的顺序排列就将其输出,否则回到步骤①

把这个算法称为“全排列算法”。

全排列算法列出了所有的排列方法,所以不管输入如何,都可以得到正确的结果。


那么,需要等多久才能出结果呢?若运气好,很快就能出现正确排列的话,结果也就立马出来了。然而,实际情况往往并不如我们所愿。

最差的情况,也就是直到最后才出现正确排列的情况下,计算机就不得不确认所有可能的排列了。
n 个数字有n! 种不同的排列方法(n! = n(n - 1)(n - 2)…3·2·1)。

现在,我们来看看n = 50时是怎样一种情况吧。

① 50! =50·49·48…3·2·1
② 50·49·48…3·2·1> 50·49·48…13·12·11
③ 50·49·48…13·12·11 >1040

公式①中,50! 即为数字1 到数字50 的乘积。为了便于计算,我们通过公式②③将结果近似转换为10 的n 次方的形式。

公式②右边部分去掉了10 以下的数字,因此小于50!。

公式③左右都是40 个数字的乘积,但左边数字都大于10,因此大于右边的1040

接下来我们就用1040 近似代表50 个数字的所有排列情况来进行计算。
假设1 台高性能计算机1 秒能检查1 万亿( = 1012)个数列,那么检查1040 个数列将花费的时间为1040÷1012 = 1028 秒。1 年为31 536 000 秒,不到108秒。因此,1028 秒> 1020 年。
从大爆炸开始宇宙已经经历了约137 亿年,即便如此也少于1011 年。也就是说,仅仅是对50 个数字进行排序,若使用全排列算法,就算花费宇宙年龄的109 倍时间也得不出答案。

使用选择排序算法进行排序
那么,使用前文提到的选择排序算法,情况又将如何呢?
首先,为了在第1 轮找到最小的数字,需要从左往右确认数列中的数字,只要查询n 个数字即可。在接下来的第2 轮中,需要从n - 1 个数字中寻找最小值,所以需要查询n - 1 个数字。
将这个步骤进行到第n 轮的时候,需要查询的次数如下。
n+ ( n- 1) + ( n- 2) + …3+ 2+ 1=n ( n+ 1)/2≤ n2
n=50 的时候n2 =2500。假设1 秒能确认1 万亿(=1012)个数字,那么2500÷1012 =0.000 000 002 5秒便能得出结果,比全排列算法的效率高得多。

猜你喜欢

转载自www.cnblogs.com/hlaotong/p/12661562.html