admin 管理员组

文章数量: 887021


2024年1月27日发(作者:php兄弟连论坛)

VB选择排序专题

班级 姓名

知识点回顾:

1、数组的作用:一组意义相同,类型相同的数据的保存,通常借助于数组。如:高二年级所有同学的学籍号可定义为大小为700(只能多不能少)的long类型的数组xjh1 to 700) 或 xjh(699);

2、数组名称可自取: 符合※以字母开头、※除了“_”外不能有其他字符、※不能用VB已用的关键字即可;

3、数组下标的定义可以从任何数开始,但通常为0或1,如:a(19),表示下标从0开始到19;a(1 to 19)表示下标从1开始。下标即位置,能代表数组值。

4、数组赋初值方法多样,通常用循环语句。没有赋值默认数组中每个数初值为0或FALSE或“”。

5、排序概念和意义:把一组类型相同的数据按照升序或者降序的规律排列起来。

6、排序的算法要点:

※将N个数据保存在数组中;

※理清是升序或是降序排序——升序为从小到大,降序为从大到小;

※算法很多——冒泡排序、选择排序、插入排序、希尔排序、快速排序等……

7、选择排序的特征:以降序为例——第一遍排序,找出最大值的位置,与数组中第一个数交换,第二遍排序,找出次大值的位置,与数组中第二个数交换。

8、关于选择排序需理解:

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

※选择排序的变式即改进算法非常多,比如N个数据排序时,发现某一遍排序两两比较过程中已没有数据交换则可以停止继续排序,比如比较过程中直接交换等,在练习中要加强理解和记录;

9、选择排序的经典代码:( 以降序为例,所有for语句都要熟练转化为do while语句 )

for i=1 to n-1 ’控制排序遍数n-1

k=i ’第i趟排序假设i位置上的数最大

for j=i+1 to n ’比较剩下的数,次数为n-i次

if d(k)

next j

if k<>i then ’如果最值位置有变化的话则交换

d(i)=d(i)+d(k):d(k)=d(i)-d(k): d(i)=d(i)-d(k)

end if

next i

for i=n to 2 step-1 ’控制排序遍数n-1

k=i ’第i趟排序假设i位置上的数最大

for j=i-1 to 1 step -1 ’ 或写成 for j=1 to i-1 step 1

if d(k)>d(j) then k=j ’记录比较之后较大数的位置

next j

if k<>i then ’如果最值位置有变化的话则交换,

t=d(i) : d(i)=d(k) : d(k)=t

end if

next i

巩固练习:

1、在VB中,如果变量p用来存储某张试卷上的缺考填涂标记,则p应采用的最适合的数据类型是( )

A.Integer B.Boolean C.Single D.String

2、VB语句“Dim a(50) As String”定义的数组元素个数以及第8个数组元素分别为( );VB语句“Dim a(1 to 50) As long”定义的数组元素个数以及第8个数组元素分别为( )

A. 51,a(7) B.50,a(7) C. 51,a(8) D.50,a(8)

3、有如下Visual Basic程序段:

m = a(2)

For j = 3 To 50

If a(j) > m Then m = a(j)

Next j

Msgbox(str(m))

该程序段执行后,变量m中存储的是( )

A、a(1)至a(50)中的最小值 B、a(2)至a(50)中的最大值

C、a(2)至a(50)中的最小值的位置 D、a(1)至a(50)中的最大值的位置

4、以下程序执行后,i的值是( )

Dim a(1 To 5) As Integer

Dim f As Boolean

a(1) = 23: a(2) = 12: a(3) = 56: a(4) = 34: a(5) = 10

i = 1: f = True

Do While i <= 5 And f = True

If a(i) = 56 Then f = False

i = i + 1

Loop

n = i

A.6 B.3 C.4 D.5

5、在2017年秋季学校运动会上,男生第一组6位选手的百米成绩(单位:秒)分别是“13.4、12.3、11.2、13.8、13.1、11.0”,若使用选择排序法将该组的成绩按第一名、第二名、第三名……的顺序排序,则第一遍排序后的顺序是( );两遍排序后的顺序是( );

A. 11.0 11.2 12.3 13.8 13.1 13.4 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

6、有一组10个数据的无序序列,利用选择排序算法进行从小到大的排序,需要比较的次数和最多需要进行加工的遍数,以及最多交换数组数据的次数分别为( )

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

7、在NBA某赛季中,快船队5场比赛得分依次为97,89,111,70,90,若采用选择排序算法对其进行从小到大排序,在整个排序过程中,数据97被交换的次数是( )

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

8、用选择排序算法对一组学生的身高数据进行升序排序,已知第一遍排序结束后的数据序列为165,168,178,175,171,则下列选项中可能是原始数据序列的是( )

A、175,178,168,165,171 B、178,168,165,175,171

C、165,178,168,175,171 D、165,168,171,175,178

9、对存储在stu ( 0 to n )中的n+1个元素用选择排序算法进行排序,元素交换次数的范围和元素比较次数的值分别为( )

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

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

10、以下是选择排序主要部分,其中线框内代码用于寻找d(a)到d(n)的最小值的下标(即通常所说的位置)。

for a=1 to n-1

k=a

For b=a+1 to n

If d(b)

Next b

next a

框内代码运行结束时,保存最小值的数组元素一定是 ( )

A、d(n) B、d(b) C、d(a) D、d(k)

11、以下程序段是选择排序的核心代码,阅读并完成以下10—12题:

#1 For i=1 to n-1 step 1

#2 k=i : j=i+1

#3 Do while j<=n

#4 If d(j)

#5 Loop

#6 Next i

12、代码中缺少一个语句,造成程序错误,应补充在 ( )

A、 #2后面 B、#3后面 C、#4后面 D、#5后面

13、缺少的语句是 ( ) A、while j<=n B、j=j+1 C、end if D、i=i+1

14、代码修改正确后,这段程序使用了两层循环(即双循环),循环次数总共( )

A、无限次 B、n*(n-1)/2次 C、n 次 D、0次

15、以下程序段的功能是找到a(1)到a(10)中较大的3个数分别存储在a(1)、a(2)、a(3)中并将前3名列在list1中,请将空白处填充完整:

1 ’控制查找遍数,这里需找出前3个即可 for ○2 ○ for j=i+1 to 10

3 if a(j)>a(k) then ○ next j

if k<>i then t=a(k):a(k)=a(i):a(i)=t

m str(a(i))

4 ○5 (冒泡排序解析算法选择排序枚举算法) 此题我们采用了○16、在淘宝网上搜索商品,可以按用户需要根据价格进行升序或降序排列。用选择排序算法编写函数实现功能。主要程序如下,其中n为商品个数,jp数组存放商品价格信息,sx为True时表示升序。请将划线部分补充完整。

Function px(sx as boolean)

Dim i,j,k as integer

Dim t as Double

for i=n to 2 step -1

1 ○for j=i-1 to 1

2 then if ○ if jg(j)

Else

3 if jg(j)>jg(k) then ○ End if

next j

4 then t=jg(i):jg(i)=jg(k):jg(k)=t if ○next i

End function

17、编写VB程序,实现如下功能: 单击“排序数组a”按钮Command1时,对已有数组a的数据进行升序排列,并显示在文本框Label1中;单击“显示数组b”按钮Command2时,将升序数组b的数据显示在文本框Label2中;再单击“合并a和b”按钮Command3时,对数组a和数组b升序合并到字符串中,将合并后的数据在文本框Label3中显示。(运行效果如图所示)。

Dim a(1 To 6),b(1 To 6) As Integer

Private Sub Command1_Click() '对数组a中的数据进行排序

Dim i As Integer, j As Integer ,k as integer

a(1) = 53 :a(2) = 18:a(3) = 62:a(4) = 22:a(5) = 6:a(6) = 25:s = ""

For i = 1 To 5

k = i

For j = ①

If a(k) > a(j) Then k=j

Next j

If i <> k Then t = a(k): a(k) = a(i): a(i) = t

Next i

For i = 1 To 6

s = s + Str(a(i))

Next i

n = s

End Sub

Private Sub Command2_Click()

b(1) = 3: b(2) = 8: b(3) = 15: b(4) = 27: b(5) = 38: b(6) = 49

'此处部分代码省略

End Sub

Private Sub Command3_Click() '将数组a和b中的数据逐个比较后添加到新的字符串s中,并显示s

i = 1: j = 1: s = ""

Do While i <= 6 ② '如果两数组都还有数据未合并

If ③ Then s = s + Str(a(i)) : i = i + 1 Else s = s + Str(b(j)) : j =j +1

Loop

Do While i <= 6 '只有数组a还有数据未合并

4 : i = i + 1 ○Loop

Do While j <= 6 '只有数组b还有数据未合并

s = s + Str(b(j)) : j = j + 1

Loop

n = s

End Sub


本文标签: 排序 数组 数据 选择