题型:综合题 题类:常考题 难易度:困难
浙江省高中信息技术 其他排序算法练习
i |
1 |
2 |
3 |
4 |
5 |
a(i) |
17 |
19 |
9 |
13 |
6 |
index(i) |
5 |
3 |
4 |
1 |
2 |
a(index(i)) |
6 |
9 |
13 |
17 |
19 |
实现上述功能的VB程序如下,但加框处代码有错,请改正。
Const n = 10
Const maxn = 20
Dim a(1 To n) As Integer, index(1 To n) As Integer, flag(1 To n) As Boolean
Private Sub Form_Load()
Dim i As Integer
Randomize
For i = 1 To n
flag(i) = False
a(i) = Int(Rnd() * maxn) + 1
List1.AddItem Str(a(i))
Next i
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer
Dim k As Integer
For i = 1 To n
For j = 1 To n
If flag(j) = False Then k = j: Exit For
Next j
For m = k + 1 To n
If Then k = m ‘⑴
Next m
index(i) = k
flag(k) = True
Next i
For i = 1 To n
List2.AddItem ‘⑵
Next i
End sub
⑴ ⑵
排序前 |
86 |
71 |
5 |
41 |
81 |
79 |
37 |
89 |
排序后 |
5 |
37 |
41 |
71 |
79 |
89 |
86 |
81 |
实现上述功能的VB程序如下,但加框处代码有错,请改正。
Const n=8
Dim a(1 To n) As Integer
Private Sub Command1_Click()
Dim i As Integer,j As Integer,k As Integer,t As Integer
Dim flag As Boolean
‘读取一组正整数,存储在数组a中。代码略
For i=1 To n-1
‘(1)
If IsPrime(a(k))Then flag=True Else flag=False
For j=i+1 To n
If IsPrime(a(i))Then
If Then ‘(2)
k=j
flag=True
End If
End If
Next j
If k<>i Then
t=a(k):a(k)=a(i):a(i)=t
End If
If Not flag Then Exit For ‘Exit For表示退出循环
Next i
‘依次输出排序后的数据。代码略
End Sub
Function IsPrime(m As Integer)As Boolean
‘本函数判断m是否是素数:是素数返问值为True,不是素数返回值为False
‘代码略
End Function
假如我们用数组表示上述大根堆:
a(1) |
a(2) |
a(3) |
a(4) |
a(5) |
a(6) |
a(7) |
a(8) |
a(9) |
9 |
6 |
8 |
5 |
3 |
4 |
7 |
2 |
1 |
现有一算法把一个无序数组改造成大根堆。例如:我们在上图的大根堆中再增加一个值为8的新元素,如下图所示。
数组存储为:
a(2) |
a(3) |
a(4) |
a(5) |
a(6) |
a(7) |
a(8) |
a(9) |
a(10) |
6 |
8 |
5 |
3 |
4 |
7 |
2 |
1 |
8 |
具体操作方法如下:
第一步:因为a(10)大于它的双亲结点a(5),故需交换a(10)和a(5)的值;
数组存储为:
第二步:因为a(5)大于它的双亲结点a(2),故需交换a(5)和a(2)(t)值;
数组存储为:
a(1) |
a(2) |
a(3) |
a(4) |
a(5) |
a(6) |
a(7) |
a(8) |
a(9) |
a(10) |
9 |
8 |
8 |
5 |
6 |
4 |
7 |
2 |
1 |
3 |
第3步:因为a(2)不大于它的双亲结点a(1),故无需做交换操作。此时新元素已经放到了正确的位置,新的大根堆构造完成,上移行动结束。
试题篮