试题

试题 试卷

logo

题型:综合题 题类:常考题 难易度:普通

浙江省高中信息技术 排序算法及程序实现同步练习

小王在研究n个数的冒泡排序算法,发现可以从两个方面进行优化:

⑴在每遍冒泡过程中,若最后一次交换的是last与last-1位置,则last位置之前的相邻数据均已有序。进行下一遍冒泡时,无序区域设置[last, n],这样可使无序区域缩小。

⑵若在某一遍排序中没有数据交换,说明待排序数据都已经有序,冒泡排序过程可在此遍排序后结束。因此可以引入一个变量flag,记录在每遍排序过程中是否发生了交换。

小王设计了如下VB程序,功能如下:按Cominandl“生成数据”后,生成一组随机的两位整数存入数组a,并输出在列表框List1中。单击Command2“排序”后,a中的数据进行降序排序,排序后的数据显示在列表框List2中,排序过程中实际的冒泡遍数显示在Label2上。程序运行界面如下所示。

实现上述功能的VB程序如下,回答下列问题:

(1)、若按小王优化后的冒泡排序算法,数据28,15,10,8,12进行降序排序,冒泡的遍数(填数字)。
(2)、在画线处填入合适的代码。

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

举一反三
【加试题】某排序算法思想如下:若有11个桶,编号从0~10,随机产生多个整数,每产生一个整数时,就在以该整数位编号的桶中放一面小旗子,最后只要按顺序数每个桶中有几面小旗子,就能得到这几个整数的有序排列。例如2号桶中有1个小旗子,表示2出现了一次;3号桶中有1个小旗子,表示3出现了一次;5号桶中有2个小旗子,表示5出现了两次;8号桶中有1个小旗子,表示8出现了一次,按桶的编号顺序读出旗子数量,没有旗子的桶略过,得到有序整数为“2,3,5,5,8”。

为此,小李编写了一个VB程序,功能如下:运行程序,窗体加载时随机产生6个[0,9]的随机整数,并在列表框List1中依次显示排序前数据,单击“排序”按钮Command1,在列表框List2 中显示经过上述排序算法后的数据。运行结果如图所示。实现上述功能的VB代码如下,但加框处代码有错,请改正。

Dim a(10) As Integer    '数组a表示桶的编号,如a(0)表示第0号桶

Private Sub Command1_Click()

    Dim i As Integer, j As Integer

    For i = 0 To 10

        For j = 1 To       ①{#blank#}1{#/blank#}

List2.AddItem  CStr(i)

        Next j

    Next i

End Sub

Private Sub Form_Load()

    Dim i As Integer

    Randomize

    For i = 0 To 10             '将数组初始化为0

        a(i) = 0

    Next i

    For i = 1 To 6            '产生6个[0,9]的随机数

        t = Int(Rnd * 10)  

        a(t) =   '第t桶中小旗子数量加1    ② {#blank#}2{#/blank#}

        List1.AddItem  CStr(t)

    Next i

End Sub

返回首页

试题篮