Sub shellsort(ByVal n As Integer) '希尔排序子程序
Dim i, j, gap As Integer
Dim k,x As Integer
gap = Int(n / 2) '置初值
While gap > 0
For i = gap + 1 To n
j = i - gap
While j > 0
If a(j) < a(j + gap) Then
x = a(j)
a(j) = a(j + gap)
a(j + gap) = x
j = j - gap
Else
j = 0
End If
Wend
Next i
gap = Int(gap / 2)’减小增量
‘输出结果
TxtList.Text = TxtList.Text + Str(gap) + ':'
For k = 1 To n
TxtList.Text = TxtList.Text + Str(a(k)) + '.'
Next k
TxtList.Text = TxtList.Text + vbCr + vbLf
Wend
End Sub
其他源程序
希尔排序按钮对应的源程序如下:
Private Sub CmdShell_Click() '希尔排序
Dim i As Integer
TxtList.Text = ''
Txtorigin.Text = ''
For i = 1 To 10 '输入原始数据
a(i) = Int(Rnd * 100)
Txtorigin.Text = Txtorigin.Text + Str(a(i)) + '.'
Next i
'调用子程序排序并输出中间结果
Call shellsort(10)
End Sub
小结
在进行希尔排序时,需注意增量序列的取值方法,并且使这些序列中的值没有除1之外的公因子,且最后一个增量值必须为1。
能解决问题的办法都是好办法,问题不一定整体解决才好。这就是分治的思想。
乱打误撞——模拟法破解难题问:“电脑解决确定问题可做到手到擒来,对于电脑中实现一个不确定的问题,例如彩票或抽奖,怎样做呢?”
答:“算法的美妙在于其准确和确定,而另有一种价值则在于其不确定,象我们的抽奖程序和彩票程序。确定的问题电脑可以处理,不确定的问题电脑也能处理,随机函数就是实现电脑中不确定事件的重要砝码。下面我们通过示例来看一下。”
随机函数的出现
通过语言编程一般来说对事物的认识是很确定的了,是一就是一,是二就是二,还有一个问题,有一些不那么确定的事情该如何处理,象我们的彩票抽奖,如果是确定的了,那也就不用抽了,恐怕也就没人玩了。
对于这一类的事情,该怎么办呢?语言中为我们提供了随机函数,也就是说通过它得到的一个值将是不能确定的。
随机函数产生的秘密
计算机常常需要模拟随机选择的数目,有多种不同的方法可以产生具有随机性质的数,由于通过此种系统的方法产生的不是真正的随机数,所以一般称做伪随机数。最常用的产生伪随机数的方法称为线性同余法。公式如下,选择四个数:模数m,乘数a,增量c和种数x0,使2≤a≤c≤x0可以生成一个伪随机序列{xn},使得对于所有的n,0≤x0。生成的办法是逐次同余:
xn+1=(axn+c)mod m
应用和变通
随机函数有一个范围,即Rnd 函数返回小于 1 但大于或等于 0的小数值。但通常我们要解的问题不在这个范围内,如何解决呢?
示例:最简单的抽奖程序,做一个猜1-100之间数的游戏。
因为随机函数的范围是一个0-1之间的小数,和题目要求的范围相差很大。所以,当我们用到的值不在这个范围之内时,我们可以想点变通的办法。要想做到从1-100之间进行取数,必须扩大100倍才行。不难计算RND*100的范围却不是1-100,而是0-100,不包括0和100,怎样就是1-100了呢?加上一就有了,范围成了1-101,不包括1和101,只要对得到的数只取整数,这个数只要这样表达就出来了,正好INT()函数起到这样的作用:
INT(RND*100+1)
所以程序也非常简单:
Private Sub Form_Click()’单击窗体
Print INT(RND*100+1)
End Sub
其中中间的代码就完成了我们题目的要求。
所以针对上述不确定的问题时,要利用好随机函数,并适当地对其做某些变通,这样问题就得到解决了。
小结
随机函数是程序设计中一道亮丽的风景。这个函数是非常有用的,她可能是计算机语言中唯一没有理性的东东了。就好象我们人类所具有的现省心的想法,妙手偶得之的佳句。正因为这个唯一性,也就不难看出她在计算机语言中的地位了。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-34162-11.html
置若罔闻
强行驱离
咱们也去转转