找到最快的算法,一直是计算机界的目标之一,而排序就是其中最基本的算法。什么样的排序才是最快的呢?
1.最少的比较次数,算法理论证明n个数排序,如果是基于比较的算法,至少需要 ㏒(n!) 向上取整数。下面给出小数目下,最少比较次数:
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
㏒(n!) | 0 | 1 | 3 | 5 | 7 | 10 | 13 | 16 |
2.移动次数最少,根据群论置换群理论,n个数的序列,变换到这n个数组成另一个序列,一定可以在最多n次移动内做到。
在理论的指引下,人们开始寻找这些传说中的极限。人们开始简单地完成了n=1,2,3,4的极限算法,但是当n=5时,人们长期停留在了8次比较。但是在1956年,H.B.Demuth在终于首先找到5个次7次比较的排序方法,并在他的博士论文中进行了阐述。下面就是对这个算法的C语言实现:
/* 1956年H.B.Demuth找到的5个数7次的比较方法,后来Lester Ford,Selmer Johnson归并插入排序中使用*/
/********************************************************************
* 示意图如下 *
* *
* [0] [1] 排序得 [0]<=[1] *
* [2] [3] 排序得 [2]<=[3] *
* [1] [3] 排序得 [1]<=[3] *
* 此时有关系:[0]<=[3],,[2]<=[1]<=[3] *
* *
* [1] [4] *
* _______|_______ *
* | | *
* [1]<