结束查找。如果不相符,再判断关键值落在中间元素的左半部还是右半部,如果在左部,则保持下界位置不变,将上界设在中间元素的前一个位置,重新查找;如果在右部,则保持上界位置不变,将下界设在中间元素的后一个位置,重新查找。如此反复进行,若下界大于上界,表明没用元素与关键值相匹配,查找结束。
例如:数组a(9)中存放从小到大的10个数字字符:2,4,7,9,10,14,18,26,32,40,查找关键字是7的元素。
Private Sub Command1_Click() Dim a(9) As Integer ‘定义数组
Dim low As Integer, hight As Integer, mid As Integer‘定义下界、上界、中间数值类型 Dim flg As Boolean ‘定义查找标志为逻辑数据 a(0)= 2: a(1)= 4: a(2)= 7: a(3)= 9: a(4)= 10
a(5)= 14: a(6)= 18: a(7)= 26: a(8)= 32: a(9)= 40 ‘数组赋值 low = 0 ‘设置下界初始值 hight = 9 ‘设置上界初始值 flg = False‘设置查找标志初始为否
Do While low <= hight ‘设置循环查找的条件为下界小于等于上界 mid = (hight + low) / 2 取下上界中间值
If a(mid) = Val(Text1.Text) Then ‘查找输入的值与数组中的值是否匹配 flg = True ‘标志为true Exit Do ‘退出循环
ElseIf Val(Text1.Text) < a(mid) Then ‘如果输入的值小于下上界中间位的值 hight = mid – 1 ‘下界不变、上界由中间位前移一位 Else ‘如果输入的值大于中间位的值
low = mid + 1‘上界不变、下界由中间位后移一位 End If Loop If flg Then
Text2.Text = \要找的数\是数组第\个位置的数\Else
Text2.Text = (Text1.Text) & \不在数组中\End If End Sub
③.冒泡法排序算法
所谓排序法,就是批将一个无序序列排成一个有序序列的过程。
排序算法在计算机编程中使用非常频繁。在实践中,人们设计出了许多好的排序算法,如交换排序、插入排序、选择排序、归并排序、基数排序。各种算法都有其自身的特点与适用范围。
“冒泡法排序”也叫“起泡法排序”,是一种比较简单、易懂的交换排序方法,它通过相邻元素进行比较和交换,逐步将一个无序序列排成一个有序序列。将元素按从小到大的顺序排序列为升序排列,反之称为降序排序。
例1:将10个无序数据存放在数组元素a(0)到a(9)中,若要将这些数据按升序排序,下面一段用冒泡法排序的程序代码,其中空白处的代码应为( )。
Dim a(10) As Integer ‘要定义为有11个元素的数组 For i=0 to 9 For j=0 to 9-i If then t=a(j) a(j)=a(j+1)
第 13 页
a(j+1)=t End if Next j Next i
分析:本题中要求升序排序,即数据由小到大的冒泡法排序,程序中使用了两重循环,外循环是控制排序趟数,每执行一趟外循环,有序部分的数据就多一个;内循环控制每趟排序时数组元素的比较和交换,也就是只对无序部分的元素进行比较和交换。If语句中条件是判断相邻两个元素的大小,如果前面的元素a(j)大于后面元素a(j+1),则交换两个元素的值,即较大的元素向后移(如果是降序排列,则刚好相反)。故空白处应是a(j)>a(j+1)。
例2:用选择排序法将数组a中随机生成的10个整数按升序排列。 Private Sub Command1_Click() Dim a(10) As Integer For i = 1 To 10
a(i) = Int(Rnd * 1000) Next i
For i = 1 To 10 For j = 1 to i
If a(i)< a(j) Then ‘ 如果后面数a(i)小于前面数a(j)
a(0)= a(i) ‘a(0)作为中间变量,把后面小的数先放入中间变量中 a(i)= a(j) ‘把前面大的数移入后面
a(j)=a(0) ‘把中间变量的数赋给前面的数,把小的数移入前面 End If Next j Next i
For i = 1 To 10 Print CStr(a(i)) Next i End Sub
④插入排序法
插入排序法也是一种常用的排序算法,其基本思想是将一个数据序列看做两部分,前一部分是有序的,后一部分是无序的,排序时把无序部分的数据元素逐个插入到有序部分,使得有序部分的元素不断增加,无序部分的元素相应减少,最后所有元素志为有序序列。通常将无序部分中的第一个数赋给哨兵,然后哨兵分别跟有序部分的数进行比较。
插入排序的直接插入排序、折半插入排序、链表插入排序和希尔排序等。
时间复杂度是指对一组无序数列排序所用的时间。当然对同一组数据进行排序,所用的时间少的算法较优。一般来说,插入排序的时间复杂度要优于冒泡排序的时间复杂度。
例1:有一组数位于数组组元素a(0)至a(10)中,见下表中的“原始值”那一行。现采用插入排序法进行升序排序,经过三趟排序后,各变量中的值见下表中的“第三趟之后”。试问,进行第四趟排序时应将元素( )赋给哨兵,通过比较后,这个哨兵的值应赋给( )。第四趟排序完成后,各变量中的值应怎么样?请填入表中。 变量 原始值 第三趟之后 第四趟之后 A(0) A(1) A(2) A(3) A(4) A(5) A(6) A(7) A(8) A(9) 8 2 9 6 6 8 2 9 7 7 5 5 15 15 3 3 17 17 0 0 A(10) 4 4 分析:这是一道插入法排序的分析题。在插入排序中,认为无序数列中的第一个是有序的,故在排序时从第二个数开始,分别赋给哨兵,将哨兵分别与前面的有序数列进行比较,然后将哨兵赋给相应的变量(即插入相应
第 14 页
的位置)。
对于本题,在进行第四趟排序时,先将a(4)赋给哨兵,将哨兵与a(3)比较,a(3)大于哨兵,将a(3)的值赋给a(4),将哨兵与a(2)比较,a(2)大于哨兵,将a(2)的值赋给a(3),将哨兵与a(1)比较,a(1)不大于哨兵,将哨兵插入到a(1)后面,即将哨兵赋给a(2),到这一步找不到了比哨兵大的数据,至此,这一趟排序结束。
第四趟后值为: 2 6 7 8 9 5 15 3 17 0 4
例2:将20个无序数据存放数组元素a(0)至a(19)中,若要将这些数按升序排列,下面是一段用插入法排序的程序代码,其中空白处的代码是( )。
For i=1 to 19 ‘从数组的第2个数开始 S=a(i) ‘赋值给哨兵 j=i-1 ‘前一值的地址
Do while a(j)>s ‘前一个值大于哨兵的值作为循环条件 A(j+1)=a(j) ‘前一值后移
j=j-1 ‘地址的值前移一位,使该位置的值与哨兵进行比较 If j<0 Then ‘如果地址的值小于数组的下界 Exit Do ‘退出 Do While 循环 Loop
A(j+1)=s ‘前一值a(j)小于哨兵,将哨兵赋值给a(j)后一值 Next i 四、应用程序设计
1.程序设计的一般步骤:
程序设计的一般步骤是:分析问题、设计算法、编写代码、调试运行。 例:编写程序,求100至1000之间的所用素数。
分析:所谓素数,就是除了本身和1以外并没有任何其它因子的正整数。可以此数除以用2到此数的平方根,如果余数为0则此数非素数。
因此可以根据循环来产生100至1000之间的素数,由于这个循环次数是确定的,可以用For/Next循环。 Dim i As integer,j As integer Dim t as Boolean For I=100 to 1000
T=false
For j=2 to sql(I)
If I mod j =0 then t=true Next j
If not t then print I Next I
2.简单的程序设计
应用所学知识进行简单的程序设计。
根据实际问题,按照分析问题、设计算法、编写代码、调试运行的步骤,独立解决简单的实际问题。能在此基础上优化程序。
例:回文数是指左右对称的十进制整数,如10201,232等,编程求所的五位数的回文数。
解此问题有多种方法,这里从完全平方数入手解决,由数学知识可知,100至326的完全平方数是五位。可提取五位数的各位数字进行比较。
Dim x As Single For i=101 to 316 x=i*I a=x \\ 10000
第 15 页
b=(x - a * 10000) \\ 1000 c=(x - (x \\ 100) * 100) \\ 10 d=x - (x \\ 10) * 10 If a=d and b=c Then
Print x End if next i
第 16 页
相关推荐: