admin 管理员组

文章数量: 1184232


2024年3月27日发(作者:redis存对象用什么类型)

VB冒泡排序专题

班级 姓名

知识点回顾:

1、冒泡排序的特征:从后往前两两比较数据,不符合大小关系的两数交换至达到要求。

2、关于冒泡需理解:

※升序:将后数小于前数的两个数进行交换;降序:将后数大于前数的两数进行交换;

※N个数最多进行N-1遍排序;两数比较的次数最多为N*(N-1)/2;两数交换次数最多为:N*(N-1)/2;

※冒泡有很多改进算法,在练习中要加强理解和记录;

3、冒泡经典代码:( 以降序为例 )

for i=1 to n-1 ’变量i控制遍数n-1

for j=n to i+1 step -1 ’控制每次比较次数n-i 和方向

if d(j)>d(j-1) then ’不满足降序(后项>前项)则交换

temp=d(j): d(j)=d(j-1):d(j-1)=temp

end if

next j

next i

for i=1 to n-1

for j=n-1 to i step -1 ’理论上而言,只需控制每次比较次数n-i即可

if d(j)

temp=d(j): d(j)=d(j+1):d(j+1)=temp

end if

next j

next i

冒泡经典算法默认数据从后往前冒,第一次比较的两个数一定是a(n)与a(n-1),一定是先把最值放a(1)中;

而事实上冒泡也可以从前往后冒,第一次比较的两个数一定是a(1)与a(2),一定是先把最值放在a(n)中。

for i=n-1 to 1 step -1 ’变量i控制遍数n-1

for i=n-1 to 1 step -1

for j= 1 to i

for j= 2 to i+1 ’ 控制比较次数n-i和方向

if d(j)d(j-1) then

temp=d(j): d(j)=d(j+1):d(j+1)=temp temp=d(j): d(j)=d(j-1):d(j-1)=temp

end if end if

next j next j

next i next i

4、字符串的排序:可以排序,按照字符的ASCII码。从第一个字符开始比较,直到比出大小,即当字符串

第一个字符一样时,按照第二个字母的ASCII码排,以此类推。例: “bcd”大于“adb”,“efad”小于“efcd”。

巩固练习:

1、在运动会上,男生第一组6位选手的百米成绩(单位:秒)分别是“13.4、12.3、11.2、13.8、13.1、11.0”,

若使用冒泡排序法将该组的成绩按第一名、第二名、第三名……的顺序排序,则第一遍排序后的顺序是

( );两遍排序后的顺序是( );

A. 11.0 11.2 13.8 13.4 12.3 13.1 B.11.0 12.3 11.2 13.8 13.1 13.4

C. 11.0 11.2 13.4 12.3 13.1 13.8 D.11.0 13.4 12.3 11.2 13.8 13.1

2、有一组10个数据的无序序列,利用冒泡排序算法进行从小到大的排序,需要比较的次数和最多交换的

次数,最多需要进行加工的遍数分别为( )

A. 9,45,9 B. 45,15,9 C.45,45,9 D.15,45,8

3、在NBA某赛季中,快船队5场比赛得分依次为97,89,111,70,90,若采用冒泡排序算法对其进行从

小到大排序,在整个排序过程中,数据97被交换的次数是( )

A.1次 B.2次 C.3次 D.4次

4、对存储在stu ( 0 to n )中的n+1个元素用冒泡排序算法进行排序,元素交换次数的范围和元素比较

次数的值分别为( )

A、[0,n],(n-1)*n/2 B、[1,(n+1)*n/2],(n-1)*n/2

C、[0,(n+1)*n/2],(n+1)*n/2 D、[1,n-1],(n+1)*n/2

5、下列关于排序的算法,不正确的是( )

A.对 N 个数组元素进行排序,冒泡排序和选择排序排序的遍数一样

B.对 N 个数组元素进行排序,冒泡排序和选择排序比较的次数一样

C.对 N 个数组元素进行排序,冒泡排序和选择排序在排序过程中交换次数一样

D.一般情况下,选择排序比冒泡排序效率更高

6、有如下程序段:

For i=7 to 5 step -1

For j=7 to 9-i step -1

If a(j)>a(j-1) then

k=a(j):a(j)=a(j-1):a(j-1)=k

End if

Next j

Next i

数组元素a(1)到a(7)的数据依次为3,9,1,5,8,6,2 经过该程序段加工后,a(1)到a(3)排列为( )

A.1 2 3 B. 9 8 6 C. 3 9 1 D. 8 6 5

7、有如下VB程序段,已知数组a中有10个元素,保存的数据分别为:56、21、18、64、72、49、3、7、

1

22、80,则程序运行后变量m的值为○

m=0:i=1

Do while i<=10

if m

i=i+1

Loop

8、以下程序段的功能是找到a(0)到中最小值并显示在label1上,请填空:

.....

a(99)

........

m=a(0)

For i=1 to 99

1

then m=a(i) if ○

next i

2

9、以下程序段的功能是找到a(1)到a(10)中最大值存储在a(10)中并打印在界面上,请填空:

.....

1

for i=1 to ○

if a(i)>a(i+1) then t=a(i):a(i)=a(i+1):a(i+1)=t

Next i

2

print ○

10、数组a(1 to 10) 中保存的数据依次分别为:80、7、56、21、18、64、72、49、38、22,则程序运行

后变量m的值为

1 j的值为

2 中显示的内容为

3 。

m=1

For j=2 to 11 step 1

If a(m)>=a(j-1) then m=j-1

Next j

=str(a(j-2))

11、假设有200个数字存储在数组中,数组下标从1开始,请运用冒泡排序及冒泡排序的变式将数组按要

求排列,在横线上填上正确的代码。

降序(常规冒泡) 升序(常规冒泡)

for i=1 to 199 for a=1 to 199

1

step -1

1

to a step -1 for j=200 to ○ for b=○

2

then

2

then if a(j)> ○if s(b)○

temp=a(j) temp=s(b)

3

a(j)=a(j-1) ○

a(j-1)=temp s(b+1)=temp

end if end if

next j next b

next i next a

降序(从前往后冒,小的数往后移) 升序(从前往后冒,大的数往后移)

for i=199 to 1 step -1 for x=199 to 1 step -1

for j=○1 to i for y=2 to ○1

if a(j) ○2 then if a(y)○2 then

temp=a(j) a(y)=a(y)+a(y-1)

3

a(j)=a(j+1)

a(j+1)=temp a(y)=a(y)-a(y-1)

end if end if

next j next y

next i next x

12、在冒泡排序时,当某一遍加工过程中没有数据交换,说明数据已经有序,无需进一步加工。为此小明

对冒泡排序进行了优化,编写了一个VB程序,功能如下,程序窗体加载即运行时,在列表框List1中显示

随机产生的n个[0,100]整数,单击“排序”的按钮Command1,在列表框List2中显示降序排序后的结果,

运行的效果图所示。实现上述功能的VB代码如下,请在划线处填空,并改正有错的加框处代码。

Const n As Integer = 10

Dim a(1 To n) As Integer

Private Sub Form_Load()

Dim i As Integer

Randomize

For i = 1 To n

1

m Str(a(i))

Next i

End Sub

Private Sub Command1_Click()

Dim tmp As Integer, i As Integer, j As Integer, k As Integer

2

For ○

k = 0

For j = n To i + 1 Step -1

If a(j) > a(j - 1) Then

应修改为:

tmp = a(j): a(j - 1) = a(j): a(j) = tmp

k = k + 1

End If

Next j

If Then i = n 应修改为:

K>0

Next i

For i = 1 To n

3

Next i

End Sub

13、n个数据的冒泡排序需要经过n-1遍加工,每一遍加工自下而上比较相邻两个数据,把较小者交换到上

面。小刘发现:当某一遍加工过程中没有数据交换,说明数据已经有序,无需进一步加工。为此,小刘对

算法进行优化,编写了一个VB程序,功能如下:运行程序时,在列表框List1中显示排序前数据,单击“排

序”按钮Commaiid1,在列表框List2 中显示这些数据按升序排序后的结果,在标签Label3中显示排序过

程的加工遍数。运行效果如图所示。实现上述功能的VB代码如下,但加框处代码有错,请改正。

Dim a(1 To 8),n As Integer

Private Sub Form_Load()

'

n=8

,排序前数据存储在数组

a

中,并在列表框

Listl

中显示;代码略

End Sub

Private Sub Command1_Click()

Dim flag As Boolean

'

flag值为True表示一遍加工中发生过交换

i = 1:flag = True

Do While 应修改为:

i <= n Or flag

flag = False

For j = n To i + 1 Step -1

1

Then If ○

k = a(j): a(j) = a(j - 1): a(j - 1) = k

2

End If

Next j

i = i + 1

Loop

Str(i)

应修改为: n = "排序过程的加工遍数为" +

For i = 1 To n

m Str(a(i))

Next i

End Sub


本文标签: 排序 数据 进行 算法 数组