内容正文:
区间、交替、分段其他形式排序
※ 区间排序
1、(2019年11月绍兴一模15)数组a保存n个(n≤1000)区间的端点:数组元素a(1)、a(2)保存第1个区间左、右端点,a(3)、a(4)保存第2个区间左、右端点,……区间排序方法(以升序为例):先按区间的左端点进行升序排序,当左端点相同时,再按右端点升序排序。示例:[1,2],[3,5],[5,6],[3,4]升序排序后的结果为:[1,2],[3,4],[3,5],[5,6]。小沈基于选择排序思想对n个区间进行升序排序并进行了优化,VB程序如下:
Dim a(1To2*1000)as Integer
’读取n个区间的左、右端点值存数组a,代码略
Private Sub Cmdl_ClickO
Dim iAs Integer,jAs Integer,p As Integer,q As Integer,iMax As Integer,iMin As Integer
p= ① :q=n
Do While p < q
If lsLarger(p,p+1)Then
iMax=p:iMin=p+l
Else
iMax=p+1iMin=p
End If
’先对区间两两分组处理,如果剩余1个区间再进行处理
For i=p+3 To q Step2
If ② Then
If IsLarger(i,iMax)Then iMax=i
If lsLarger(iMin,i-1)Then iMin=i-1
Else
If lsLarger(i-1,iMax)Then iMax=i-1
If IsLarger(iMin,i)Then iMin=i
End If
Next i
If n Mod2=1Then
If IsLarger(q,iMax)Then iMax=q
If IsLarger(iMin,q)Then iMin=q
End If
t=a(2*iMin-1):a(2*iMin-1)=a(2*p-1):a(2*p-1)=t
t=a(2*iMin):a(2*iMin)=a(2*p):a(2*p)=t
If iMax=p Then iMin=iMax
t=a(2*iMax-1):a(2*iMax-1)=a(2*q-1):a(2*q-1)=t
t=a(2*iMax):a(2*iMax)=a(2*q):a(2*q)=t
p=p+1:q=q-1
Loop
’输出排序结果,代码略
End Sub
’本函数判断a数组中第i区间是否大于第j区间,如果是则返回True,否则返回False
Function IsLarger(i As Integer,j As Integer)As Boolean
Ifa(2*i-1)>a(2*j-1)Ora(2*i-1)=a(2*j-1)And a(2*i)>a(2*j)Then
IsLarger=True
Else
IsLarger=False
End If
End Function
请回答问题:
(1)触发事件处理过程Cmdl_Click的对象是 .
(2)请在①②划线处填入合适代码。
(3)加框处代码有错,请改正。
2、(嘉兴一模16)小明编写了一个有关整数闭区间合并操作的VB程序:从数据库读取闭区
间数据(左端点和右端点),存储在数组a中,按区间数据左端点升序排序,然后进行合
并操作,操作结果存储在数组b中。
例如,读取的数据为2、3、15、25、10、14、1、5、30、60、15、25,过程是:
(1)设置区间信息为[2,3],[15,25],[10,14],[1,5],[30,60],[15,25];
(2)按区间左端点升序排序,得到区间信息为[1,5],[2,3],[10,14],[15,25],[15,25],
[30,60];
(3)合并区间,得到[1,5],[10,25],[30,60]。说明:区间[1,5]和[2,3]合并为[1,5],区间
[10,14]和[15,25]合并为[10,25],区间[10,25]和[15,25]合并为[10,25],因此合并后的结果为:[1,5],[10,25],[30,60]三个区间。
程序功能如下:单击“读数据库”按钮Command1,程序从数据库读取数据,输出在文
本框Text1中;单击“开始处理”按钮 Command2,程序进行区间排序,并进行区间合并操
作,操作后的结果输出在文本框Text2中。程序运行结果如下图所示。
实现上述功能的VB程序如下,请回答下列问题:
(1)从数据库中读入的区间为“[1,10],[15,20],[6,18],[25,30],[31,200]”,则合并操作后的结果为:
(2)请在划线处填入合适的代码。
Dim a(1T