题型:综合题 题类:常考题 难易度:普通
浙江省高中信息技术 排序算法及程序实现同步练习
⑴在每遍冒泡过程中,若最后一次交换的是last与last-1位置,则last位置之前的相邻数据均已有序。进行下一遍冒泡时,无序区域设置[last, n],这样可使无序区域缩小。
⑵若在某一遍排序中没有数据交换,说明待排序数据都已经有序,冒泡排序过程可在此遍排序后结束。因此可以引入一个变量flag,记录在每遍排序过程中是否发生了交换。
小王设计了如下VB程序,功能如下:按Cominandl“生成数据”后,生成一组随机的两位整数存入数组a,并输出在列表框List1中。单击Command2“排序”后,a中的数据进行降序排序,排序后的数据显示在列表框List2中,排序过程中实际的冒泡遍数显示在Label2上。程序运行界面如下所示。
实现上述功能的VB程序如下,回答下列问题:
Dim a(1 To 20) As Integer
Private Sub Commandl_Click()
Dim i As Integer, j As Integer
List1. Clear: List2. Clear
Randomize
For i=1 To 20
For j=1 To i-1
If a(i)=a(j) Then i=i-1: Exit For
Next j
Next i
For i=1 To 20
Listl. Addltem Str(a(i))
Next i
End Sub
Private Sub Commandl2_Click()
Dim flag As Boolean, i As Integer, j As Integer
Dim temp As Integer, nuui As Integer, last As Integer
nuin=0: last=1
flag=True
Do While flag=True
For j=20 To last+1 Step-1
If a(j) > a(j-1) Then
temp=a(j): a(j)=a(j-1): a(j-1)=temp
flag=True ‘有交换发生
End If
Next j
num=num+1
Loop
For i=1 To 20
List2. Addltem Str(a(i))
Next i
Label3. Caption=“本次排序的冒泡遍数为:” & Str (num)
End Sub
原始数据 | 1201 | 2120 | 1009 | 1987 | 2009 |
第一趟 | 2120 | 1201 | 1009 | 1987 | 2009 |
第二趟 | |||||
第三趟 | 2120 | 2009 | 1987 | 1009 | 1201 |
第四趟 | 2120 | 2009 | 1987 | 1201 | 1009 |
原始数据:
a(1) |
a(2) |
a(3) |
a(4) |
1 |
2 |
3 |
4 |
方法一:
①向右旋转1步:
a(1) |
a(2) |
a(3) |
a(4) |
4 |
1 |
2 |
3 |
②向右旋转2步:
a(1) |
a(2) |
a(3) |
a(4) |
3 |
4 |
1 |
2 |
③向右旋转3步:
a(1) |
a(2) |
a(3) |
a(4) |
2 |
3 |
4 |
1 |
方法二:
①将a(1)值放至旋转3个位置后位置a(4):
a(1) |
a(2) |
a(3) |
a(4) |
1 |
2 |
3 |
1 |
②将原a(4)值放至旋转3个位置后位置a(3):
a(1) |
a(2) |
a(3) |
a(4) |
1 |
2 |
4 |
1 |
③将原a(3)值放至旋转3个位置后位置a(2):
a(1) |
a(2) |
a(3) |
a(4) |
1 |
3 |
4 |
1 |
④将原a(2)值放至旋转3个位置后位置a(1):
a(1) |
a(2) |
a(3) |
a(4) |
2 |
3 |
4 |
1 |
有n个数存储在数组a中,给定一个整数p(1≤p≤n),将数组a的前p个数与后n-p个数分别向右旋转k次。例如数组a的各个数值分别是1,2,3,4,5,6,7,当p=4,k=1时,旋转后的结果为4,1,2,3,7,5,6。小明为此编写了VB程序,功能如下:在文本框Text2、Text3中依次输入p和k的值,单击“旋转数组”按钮Command1后,数组旋转后结果显示在Text4中。程序运行界面如图1所示,请回答下列问题:
图1
试题篮