1、随机排序的一种算法及其在准考证号生成中的应用曾棕根 1(宁波职业技术学院工学院,浙江 宁波 315800)摘 要:本文提出了除升序排序、降序排序之外的第三种排序随机排序,并将随机排序分为完全随机排序和不完全随机排序两类,最后,进述了随机排序在 Visual Basic 6 和C+下的算法实现及随机排序算法在大规模准考证生成中的应用实例。关键词:排序;随机排序;完全随机排序;不完全随机排序;算法;Visual Basic 6;C+;Random Sort and Its Algorithm EstablishmentZeng Zong-genAbstract: The paper puts fo
2、rward the third kind sort method Random Sort besides sort ascending and sort descending, and divide Random Sort into Full Random Sort and Part Random Sort. In the end, the paper narrates the Algorithm Establishment of Random Sort on Visual Basic 6 and C+ and an application in forming examination num
3、bers.Key Words: Sort; Random Sort; Full Random Sort; Part Random Sort; Algorithm; Visual Basic 6; C+;0 引言对一组数据,除了需要对它们进行常规的升降序排序工作之外,在很多场合下,往往需要将它们的顺序随机打乱,这种操作,笔者称之为随机排序。根据排序后的位置是否完全打乱和部分打乱,随机排序分为两类,一类是待排序的数据在经过随机排序操作后,还可能出现在原先的位置上,这种排序,笔者称之为不完全随机排序;另一类是经过随机排序操作后,待排序数据不会出现在原来的位置上,这种排序,笔者称之为完全随机排序。完全
4、随机排序与不完全随机排序在本质上是一样的,但实现上稍有些不同。本文以完全随机排序为例讲解算法。1 完全随机排序算法有一批数据,共 n 个,依次为 a1,a2,a3,an-1,an,需要对它们进行完全随机排序。排序方法与直接选择排序算法类似,从左边排到右边,即从 ai+1an中随机抽取一个数据与 ai交换(1 i n-1) 。先排序第一个数据 a1:从 a2an中随机抽出一个数据与 a1交换;再排第二个数据 a2:从 a3an中随机抽取一个数据与 a2交换;再排第三个数据 a3:从 a4an中随机抽取一个数据与 a3交换;最后排第 n-1 个数据 an-1:从 anan中随机抽取一个数据与an-
5、1交换;第 n 个数据已不需要排序。这样,总共需要排 n-1 次。从以上的算法分析中可以看出,每个待排序数据都会与其它数据交换位置,所以,每个数据都不会出现在原先的位置上,这是完全随机排序。1 作者简介:曾棕根(1975-) ,男,江西新干人,宁波职业技术学院助教。硕士研究生。22 完全随机排序算法的 Visual Basic 6 实现随机排序的实现是基于随机函数的,它可以用数组很方便地来实现。首先要根据问题的规模来定义数组的大小。如果问题的规模为 10,即有十个数据需要进行随机排序,则需定义大小为 10 个元素的数组,然后将待排的 10 个数据依次存入数组中。这里假定数组定义为 A(10),
6、10 个数据分别为 1,2,3,4,5,6,7,8,9,10。这样有 A(1)=1,A(2)=2,A(3)=3,A(10)=10。接下来,程序就要这十个元素的内容进行完全随机排序。根据完全随机排序原理,先排 A(1)元素:从 A(2)A(10)中随机抽取一个元素与 A(1)交换内容。实现这种随机抽取工作,实质上就是要从2,10之间随机产生一个整数 i,那么 A(i)就成为随机抽取的元素。因此,随机产生x,y之间的一个整数就成为实现完全随机排序算法的核心问题。Visual Basic 6 中产生随机数的函数是 Rnd 函数。但 Rnd 产生的是一个(0,1)之间的随机小数。这样,产生x,y 之间
7、的一个随机整数,应当是通过表达式 Int(Rnd*(y-x+1)+x)产生。本文不证明这个公式。如果要产生(x,y)之间的一个随机整数,很显然,与产生 x-1,y-1之间的一个随机整数是同一个问题。这样,对 1,2,3,4,5,6,7,8,9,10 这十个数据进行完全随机排序的完整程序实现为:Cls 清除窗体上的文字Dim i As IntegerDim p As IntegerDim c As IntegerDim A(10) 问题规模为 10 个数据Randomize Timer 用 Timer 来种随机数种子For i = 1 To 10 将数据赋给数组A(i) = iNext iFor
8、 i = 1 To 9 完全随机排序算法p = Int(Rnd * (10 - (i + 1) + 1) + (i + 1) 产生一个i+1,10之间的随机整数c = A(i): A(i) = A(p): A(p) = c 交换 a(i)与 a(p)Next iFor i = 1 To 10 打印排序后的数据Print A(i);Next i3 完全随机排序算法的 C+实现完全随机排序算法在 C+下可以利用 rand()函数来实现。Rand() 函数产生的是一个0,32767之间的一个随机整数,而 rand()%n(n 为非负整数)则是产生一个0 ,n-1之间的随机整数。这样,要产生一个AFr
9、om ,ATo (AFrom 和 ATo 是非负整数)之间的随机整数,则可用如下这个构造式来产生:rand()%(ATo-AFrom+1)+Afrom下面这段代码实现了对连续整数 110 的随机排序:int i,p,c;int *arr;arr=new int10;/如果分配堆内存不成功,则退出过程3if(!arr)coutRecordCount;Room=new intRecordCount+1;Chair=new intRecordCount+1;j=1;4k=1;for(i=1;iStrToInt(Edit3-Text)j=1;k=k+1;p=1;for(i=1;iEdit3-Text)
10、p=1;/初始化随机数发生器randomize();for(i=1;iFirst();for(i=1;iEdit();ADOQuery1-FieldValues“ExamRoom“=Roomi;ADOQuery1-FieldValues“ExamChair“=Chairi;ADOQuery1-FieldValues“ExamNumber“=DBEdit1-Text + “000“ + IntToStr(Roomi) + “000“ + IntToStr(Chairi);ADOQuery1-Post();ADOQuery1-Next();5delete Room;delete Chair;ADO
11、Query1-First() ;ShowMessage(“本操作成功完成“);5 结束语以上是以完全随机排序的算法实现为例。如果要求对数据进行不完全随机排序,那么,只要从第 i 个到第 n 个数据中随机抽取一个数据与待排序数据(即第 i 个数据)交换即可(1 i n-1) 。随机排序算法简洁、可靠,在诸如洗扑克牌、大规模考试的准考证编排、随机播放曲目列表的生成等等的问题解决中有着特殊的用途。参 考 文 献1谭浩强,BASIC 语言-QBASIC(第五版,修订本)M,北京:科学普及出版社,1998-122赵茜,QBASIC 程序设计M,北京:电子工业出版社,1998-53贺世娟,陈冀川,Visual Basic 6.0 程序设计,北京:中国水利水电出版社,2002-84王燕,面向对象的理论与 C+实践,北京:清华大学出版社,1997-25 谭浩强,C 程序设计(第二版) ,北京:清华大学出版社,1999-126Borland Software Corporation,C+Builder 6 C+Builder Help,20027王育坚,Visual C+面向对象编程教程,2003 年 9 月第 1 版,北京:清华大学出版社8侯俊杰,深入浅出 MFC(第 2 版) ,2001 年 1 月第 2 版,第 16 次印刷,武汉:华中科技大学出版社