遵守规则 排序随机数

数字职场

排序是编程的基础功能,在行业软件开发中拥有不可或缺的地位,例如股票交易、航空时刻显示等与百姓息息相关的系统时时刻刻都在进行数据的排序和比较。基于排序的重要性,在软件开发行业的招聘考试中,排序试题的身影频频出现。光声世纪信息科技开发公司是一家从事地理信息系统开发的公司,该公司的排序考题非常有代表性,下面我们就来看看吧。

题目:随机数组1、9、8、2、5、5-4、9-7、8-3、2-2-2 ,排序结果是 1、2、5、8、9、5-4.8-3、9-7、2-2-2,用你熟悉的语言写一个适合上面排序规则的程序。

剖析:这是一道典型的考查排序的试题,从题目中我们可以发现随机数不全是数字,有的含有“-”字符,因此可以通过字符串比较进行排序。排序规则是先把没有“-”字符的数字排在最前面,接着是有一个“-”字符的数字,最后是有两个“-”字符的数字(见图)。

11-g13-image001.jpg

程序设计的思路是将生成的随机数存储在一个字符串数组中,然后进行字符串比较,用的是冒泡法,用冒泡法时需注意满足字符串a和字符串b的冒泡条件:

1. b

2. b的长度<=a的长度

解题步骤

第一步:生成随机数

生成随机数用random函数,如果要1~9的随机数应该是random(9)+1。我们分三步来生成三种类型的随机数,关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

Randomize; //随机种子

//产生第一组随机数

for i:=1 to 4 do

begin

tmpnum1:= random(9)+1;

ListBox1.Items.Add(IntToStr(tmpnum1));

end;

//产生第二组随机数

for i:=1 to 4 do

begin

tmpnum1:= random(9)+1;

tmpnum2:=random(9)+1;

ListBox1.Items.Add(IntToStr(tmpnum1)+'-'+IntToStr(tmpnum2));

end;

第二步:冒泡法排序

冒泡排序的算法是依次比较相邻的两个数,将小数放在前面,大数放在后面,直到比较最后两个数为止,整个过程中总是小数往前放,大数往后放。根据题目规则,我们不但要考虑到排序过程中两个字符串的大小,还要考虑字符串的长度,字符串变量b的长度小于等于字符串a的长度且字符串b小于字符串a,才能把b放在a的前面,关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

//先读取Listbox的行写给num数组

for i:=0 to 11 do

begin

num[i]:= ListBox1.Items[i] ;

end;

//冒泡法排序

for i := 0 to 10 do

for j := i+1 to 11 do

begin

if (Length(num[j])<=Length(num[i])) and (num[j] < num[i]) then

begin

tmpnum := num[i];

num[i] := num[j];

num[j] := tmpnum;

我的建议>>

在项目开发过程中,我们经常遇到根据需求进行排序的问题,例如汽车牌号排序、图书馆目录排序、产品编号排序等,所以在招聘考试中出现与排序相关的考题一点都不稀奇。在做题时,不能简单地照搬教科书中的方法。

例如很多考生在做这道题时,最先想到的就是生成三个数组,第一个数组存储纯数字,第二个数组存储带有一个“-”的字符串,第三个数组存储带有两个“-”的字符串,分开进行排序再合并输出结果。这种方法是很教科书式的,代码繁多程序臃肿,毫无实用性。