VFP中产生随机数并实现起泡排序
2009-05-28 11:57:52 来源:WEB开发网本文来介绍一下在vfp中实现起泡排序的问题,考虑到做成实例比较好理解,因此本文还是会以实例的方式来表达。本例在刚开始设计时,是采用这种方式来处理的:定义一个作用域为全局的、宽度为10的一维数组,利用表单上的文本框连续输入并接收10个数字,然后再对这10个数字进行从小到大的排序。不过运行了一下,觉得这种方式好麻烦,便改成了使用随机函数产生10个数字并对它们排序,所以本文也涉及到了一点vfp中的随机函数。
本例运行时如下图:
下面我们进入正题,首先看一下如何在vfp中产生随机数。有的学友以为vfp中无法产生随机数,其实vfp中有一个专门的Rand()函数来做这个事,关于这个函数可参考:http://bianceng.cn/mcc/mcc16/mcc16_rand.htm。需要注意的是,这个函数产生的是0到1之间的随机数,即产生的是小数。所以本例对这个函数产生的值进行乘100的操作,目的是将Rand()函数产生的随机数序列转变成整数使用。
再来看一下起泡排序。起泡排序的解决思路是依次对一列数中相邻的两个数进行比较,每次两两比较时将小的数放到前面,大的数放到后面。你可以把这列数想象为纵向排列的,每次比较时如同向池塘中扔进了一枚石子,轻的水泡浮到了水面,重的石子沉到水底。我们先来看一下这个问题的简单点的例子,分析一下对4个数用起泡法进行由小到大排序的过程,如下图:
在上图中,有9、8、4、2三个数,首先第一次比较将前两个数9和8对调,第二次将第二及第三个数9和4对调,第三次将第三及第四个数9和2对调,进行了3次两两比较即结束了第一趟的比较,并得到了一个8、4、2、9的序列,此时这4个数中最大的数9已经“沉底”,在第二趟比较中对剩下的3个数(即8、4、2)进行两两比较即可;
在第二趟比较中,第一次对8和4进行比较并把大的放到下面,第二次对8和2进行比较并把大的放到下面。经过这两次比较后,第一趟比较把剩下的这3个数的大的数8也已经“沉底”。此时第二趟比较结束,并得到了一个4、2、8、9的序列,在第三趟比较中对剩下的2个数(即4、2)进行两两比较即可
在第三趟比较中,对剩余的两个数4和2进行比较、对调,第三趟比较结束,整个排序过程也结束,并得到了最终的排序结果序列:2、4、8、9。
这是对4个数用起泡法进行由小到大排序的过程,可以总结一下:4个数总共需要进行3趟比较,在第一趟比较中需要两两比较3次,第二趟比较中需要两两比较2次,而在第三趟比较中需要两两比较1次,即随着趟数的增加,趟中的比较次数是一个递减的关系,并且任意一趟的两两比较次数都是这个序列的数字个数与该趟的趟数的差。那么通过这个例子把这个问题一般化:假设进行排序的是n个数,则总共需要进行n-1趟比较,在第1趟比较中需要进行n-1次两两比较,在第j趟比较中需要进行n-j次两两比较。
关于为什么n个数需要n-1趟比较,可以举这样一个简单例子:假设有10个人围成一圈,如果要其中的一个人依次和其它的朋友握一下手,那么他需要握几次手呢?很明显是9次,因为他要把自己排除在外的。同理,如果是n个人就需要握n-1次手了。
下面我们进入实例制作过程:
一、新建表单,并向表单上添加一个编辑框控件Edit1及3个命令按钮command1~command3.
二、将3个命令按钮command1~command3的caption属性依次设置为:“生成10个随机整数”、“清屏”和“起泡排序”。
三、添加事件代码:
1、命令按钮command1(“生成10个随机整数”)的click事件:
public s(10) for i=1 to 10 s(i)=int(rand()*100) &&产生两位数的随机整数 thisform.edit1.value=thisform.edit1.value+str(s(i),5) endfor
2、命令按钮command2(“清屏”)的click事件:thisform.edit1.value=""
3、命令按钮command3的click事件:
for i=1 to 9 for j=i+1 to 10 if s(i)>s(j) t=s(i) &&t是中间变量,用于交换两个变量的值 s(i)=s(j) s(j)=t endif endfor endfor thisform.edit1.value="" for i=1 to 10 thisform.edit1.value=thisform.edit1.value+str(s(i),5) endfor
四、ok了,运行表单吧。
更多精彩
赞助商链接