标题排名新方法:无比排序
栏目软件世界
作者章海峰
发布2001年35期
笔者阅读了《电脑报》第30期B11版《解决“排名次”问题》的文章,想起了本人在解决该问题时的算法:无比排序。这种算法的特点是无须比较键值的大小,因此效率很高,不过在实现的过程中需要辅助存储且对键值不是整数类型需要辅助变换及多次排序。
下面以“按学习成绩总分排出名次”为例详细说明。本例中所使用的变量交待如下:
cj(n):第n位学生的成绩
mc(n):第n位学生的名次
zf:总分满分值
rs(x):成绩为x的人数
dyrs(x):成绩>x的人数
算法:
1.统计每个分值的人数/循环 n 人;
2.累计大于该分值的人数 /循环 zf 次;
3.根据学生的总分及大于该学生总分的人数确定名次;
下面是VB的过程代码:
Sub Pmc()
Dim fs(zf),zyrs(zf+1)
For i = 1 To n
rs(cj(i))=rs(cj(i))+1
Next i
For i = zf To 1 Step -1
dyrs(i-1)=dyrs(i)+rs(i)
Next i
For i = 1 To n
mc(i)= dyfs(cj(i))+1
Next i
End Sub
其他语言的程序可依此类推。
以上是以键值为小范围整数为例的程序,当排序键值为长整型、浮点数、日期时间和字符串等类型或数据不是用数组而是线性表,以及需按排序结果重新排列位置等算法就不赘述了。