计算机不仅是计算的机器,它还可存贮并处理数据。比如,它可以重新排序数据,排序是计算机用户普遍使用的。例如,在天文学中:按赤经或赤纬排序恒星;按年代顺序排序;按半长轴排序小行星,或按字母顺序排序。有各种不同的排序方法。在本章,我们将给出3种方法,提供BASIC程序,并比较计算时间。
一种最简单的排序方法,在表6.A中的“最简单排序”。我们开始从N个数据X(1)、X(2)、...,X(N)。这些数据可以是任意的,相同的数据可以出现多次。
在执行这段程序之后,数组X(I)是按各升序排队的。如果希望它们按降序排队,在120行把“>=”换为“<=”即可,或者把X(I)换为-X(I)。
每执行一步,交换两个元素。依次,最小的元素置前(I=1时),然后下一个,等等,最后是N-1。注意100行,索引I只到N-1,而不是N。
这种方法也叫做“插入法”。当然,对N个数排序所需的时间取决计算机的型号及程序设计语言,但是任何情况下时间开销大约与N的平方成正比。这就意味着,这种方法不适合N很大的情况。
表中名为“较好”的排序方法,速度快一些,但时间开销还是与N的平方成正比。这种排序方法很简单:找到较小的元素,就交换这两个元素,使小的置前。
当数据量很大时,可以使用一种更好的方法,称为“快速排序”,它是C.A.R.Hoare发明的。这种排序程序比较长,但计算时间非常少。另外,当N足够大,计算时间大约与N成正比,而不是N的平方(实际上,它接近与N*lon(N)成正比)。
“快速排序”技术需要两个较小的一维辅助数组:L(M)和R(M)。M至少取大于log2(N)的整数(log2是指以2为底的对数)。对于所有实际应用,M取30显然足够了。
在表6.B中,我们描述了,在HP-85微机上,以上三种程序在不同N值下的时间开销。正如我们已经说过的,在不同的计算机上,这个时间开销有所不同,但不管怎样,我们发现,除了“快速排序”算法,时间开销随N的增加而迅速增加。
为了使我们对大数据量排序的速度有个概念,我们使用了更快的计算机,并且把这些程序改写为FORTRAN语言。测度结果如表6.C,在此,快速排序的优势是很显的。当N=300,“快速排序”的时间开销仅是“较好排序”的15%,当N=1500时,仅为1%。
有时情况下,我们甚至不用编写排序程序。例如,在TRS-80 I型电脑上已经包含有排序函数,对1000个数排序仅需9秒,8000个数仅需83秒,这表明其排序时间开销大约与N成正比,而不是N的平方,所以该函数很可能使用了“快速排序”算法。
结论:当数据量不大时(如N<200),我们推荐使用“插入排序”(即上面说的“简单排序”),当数据量很大时,应单使用“快速排序”。
另外,数据常以字串类型存贮,如 X$(1)="Ceres"、X$(2)="Pallas"等。每个字符都有一个序号值(内码)。所有的字符构成以下列表,称为ASCII表,表6.D给出了ASCII表的一部分。 ASCII = American Standard Code for Information Interchange]