资源简介 (共54张PPT)专题22 选择排序选择排序第i趟排序的算法是:在数据区间[_____]范围内,查找最值的位置k,并把该位置的数与第____个数进行交换,使得[_____]数据有序。该算法包括两个步骤,一是查找区间[i,n]中最值位置k,二是交换位置k与位置____上值。让变量i从1重复执行到______,使得整个序列有序。一、理解变量i、j和k的含义变量____控制排序的趟数,n个数需要通过______趟(轮)排序;变量____表示比较大小的元素位置,j的初值和终值决定了比较的方向和区间范围,内循环的次数总比区间内数据数量少1个;k表示每趟中最大或最小数所在位置,k初值为____,如果k发生移动,即k<>i,将要交换_____和_____的值。二、比较的方向和步骤第i趟排序:在区间[i,n]中查找最值的位置k。每趟k的初值默认在第i个位置,因此比较的范围在[________],每次比较的位置j在最值k的后面。i,ni1,in-1in-1jiia(i)a(k)i+1,n三、以5个元素a(1)至a(5)选择排序升序为例趟数 排序 区域 k初值 k所在位置的最值与j所在位置的数组元素比较 比较 次数 有序区域第1次 第2次 第3次 第4次 j初值 i=1 _______ 1 k→2 k→3 k→4 k→5 2 4 [1,1]i=2 _______ 2 k→3 k→4 k→5 3 3 [1,2]i=3 _______ 3 k→4 k→5 4 2 [1,3]i=4 _______ 4 k→5 5 1 [1,4][1,n][2,n][3,n][4,n]①第i趟排序的区间是[i,n],最值k默认的位置为i,因此比较位置j每次从i+1开始,一直到最后,用最值k所在位置的数a(k)与a(j)比较,如果a(k)②通过判断k和j的位置前后关系,来判断程序实现的是升序,还是降序。若k=i: For j=i+1 To n,那么所有的a(j)位于a(k)的后面(右面),如果条件a(j)>a(k)成立,表示后面的数据比较最值还要小,因此是查找最小值。若k=n: For j=n-1 To i Step -1,那么所有的a(j)位于a(k)的前面(左面),如果条件a(k)③每趟数据是否交换的条件取决于k值是否发生了更新。在比较过程中,只是发生了k值的更新,而没有进行数据交换,即每趟最多只交换了一次。④每趟的操作查找最值位置k与交换第i个位置与k位置上值的过程,使得位置i上的数据有序,重复每趟排序,使得全部数据有序。四、冒泡排序与选择排序的区别排序 比较对象 交换情况冒泡 相邻的两个数 比较后,逆序即交换,每趟可能交换多次选择 最值与待排序区域的数 最值与第i个数交换,每趟最多交换一次五、选择排序标准代码(在数组a中,以升序为例进行选择排序)For i=1 To n-1 ′n个数共进行n-1趟排序K=i ′第i趟排序时,首先用k记录iFor j=i+1 To n ′k位置上的数依次与j位置上的数进行比较If a(j)Next jIf k<>i Then ′若i位置上的数不是最小数,则和k位置上的数进行互换temp=a(i):a(i)=a(k):a(k)=tempEnd IfNext iD考点一 选择排序的算法思想第i趟排序实现在区间[i,n]中查找最值的位置k,交换a(i)与a(k)的值,实现第i位置的值有序。【例1】 有6位裁判为运动员评分,给出的分数分别为49,45,61,46,58,57。采用选择排序算法对其进行排序,若完成第一遍时的结果为61,45,49,46,58,57,则完成第二遍时的结果是( )A.61,45,49,46,58,57 B.61,58,57,49,45,46C.61,58,57,46,45,49 D.61,58,49,46,45,57解析 从第一遍的结果可以看出排序要求是从大到小排。选择排序的基本思想是从所有的记录中选出最大(从大到小排序时)的数据,把它与第一个数据进行交换,然后在其余的记录中再选出最大的数据与第二个数据进行交换。因此第二遍排序58与45交换,得到61、58、49、46、45、57。B【变式1】 对“842715”中的数字进行选择排序中的两遍“加工”即为某密码锁的密码,该密码可能是( )A.842715 B.872415 C.142785 D.124578解析 题目并未说明是升序还是降序排列,故两种情况都有可能。若按升序排列,第一轮排序结果是:142785,第二遍排序结果是:124785,无相应选项。若按降序排列,第一轮排序结果是:842715,第二遍排序结果是:872415。【例2】 有如下VB程序段:′生成6个随机正整数,依次存入数组a(1)到(6),代码略n=6: p=Int(Rnd*3)For i=1 To 2k=iFor j=i+1 To n-pIf a(j)>a(k) Then k=jNext jIf k <>i Thent=a(i): a(i)=a(k): a(k)=tEnd IfNext iC执行上述程序段后,下列选项中,a(1)到a(6)各元素的值不可能是( )A.8,5,4,5,5,2 B.7,6,5,4,9,1C.7,5,6,4,3,2 D.8,5,1,2,4,8解析 本题考查选择排序的算法思想。产生p的值可能是0,1,2。选择排序的右边界是n-p,即右边可能有p个数据没有参加排序,意味着最后p个数可能比前面的数都要大,因为没参加排序,还在原来位置。外循环共执行了2次,把两个最大值放在第1和第2个位置,因此前两个数必须是有序。A选项把2个最值放在前面。B选项当p=2时,9没有参加排序,两个最值在前面。C选项第2项在第1至4个数据中无序,因此不可能。D选项当p=1时,最后一个8没有参加排序。D【变式2】 有如下VB程序段:′生成5个随机正整数,依次存入数组a(1)到(5),代码略For i=2 To 3k=iFor j=i+1 To nIf a(j) Mod 10< a(k) Mod 10 Then k=jNext jIf k <>i Then t=a(i): a(i)=a(k): a(k)=tNext i数组a中存储了5个整数,则运行该代码后,a数组是可能的是( )A.41 34 28 35 44 B.28 34 35 41 44C.41 34 35 44 28 D.28 41 44 35 34解析 本题考查选择排序的算法思想。选择排序第i趟实现第i个数据有序,i从2开始,由小到大进行了2趟,第1个数没有参加排序,因此第2个和第3个数据在后面所有的数据中必须是有序的,比较的对象是a(j) Mod 10与冒泡排序一样,要注意排序的趟数、排序的范围(排序的区间)和比较的对象,外循环表示排序的趟数,也表示有序的位置,要注意外循环的初值和终值,理解了有序的区间。内循环表示比较对象的开始位置和结束位置,特别是右区间小于元素个数n,部分数据并没有参加排序。考点二 混和排序在一趟排序中,可以同时采用冒泡和选择两种排序方法,实现首尾分别有序。【例3】 下列VB程序段的功能为:对数组a中的n个元素进行排序,生成左右交替上升的数据系列。如排序前a中元素依次为:21,33,56,11,44,60,程序运行后a中元素依次为:11,33,56,60,44,21。For i=1 To____①____k=iFor j=i+1 To n-i+1If a(k)>a(j) Then k=____②____Next jIf k <>i Then t=a(k): a(k)=a(i): a(i)=tFor j=____③____CIf a(j) a(j)=a(j)+a(j+1):a(j+1)=a(j)-a(j+1):a(j)=a(j)-a(j+1)End IfNext jNext i上述程序段3个划线处的表达式分别为( )A.①n-1 ②j+1 ③i To n-i+1 B.①n-1 ②j+1 ③i To n-iC.①n\2 ②j ③i+1 To n-I D.①n\2 ②j ③i+1 To n-i+1解析 本题考核的是冒泡排序和选择排序算法。在每趟排序中,先采用选择排序把最小的数排到第i的位置,采用冒泡排序的算法,最大的时候排在n-i+1的位置。因此一趟排序,有两个数据有序,只需要排n\2趟。在冒泡排序中,排序的范围应该是[i+1,n-i+1],比较对象是a(j)和a(j+1),循环的终值是n+i。【变式3】 (2021·1月浙江选考)某物品柜有5层,每层有10格子,每个格子只能放一个物品。第1层格子编号依次为1到10,第2层格子编号依次为11到20,依此类推。有9组物品(组号1~9),每组有2到8个物品,物品总数不超过50个。将9组物品按组号由小到大依次放入柜中,放置方式有两种:1)整体放置。按格子编号由小到大的次序查找第一个可放置该组全部物品的空区域(空区域是指从某个空格子开始的同层连续的所有空格子),若找到,则在该空区域中、连续放置该组全部物品,如图a所示。图a2)零散放置。若所在空区域格子数都小于该组物品数,则将该组每个物品依次放置在当前编号最小的空格子中,如图b所示。图b编写VB程序,模拟物品放置。运行程序,在列表框List1中显示每组物品的组号和数量,单击“放置”按钮Command1,在列表框List2中显示每组物品放置结果。程序运行界面如图c所示。图c(1)若第1、第2组的物品数分别为6和2,则放置第2组物品的格子编号依次为________。(2)实现上述功能的VB程序如下,请在划线处填入合适的代码。Const m=50 ′m表示物品柜的格子数Const w=10 ′w表示物品柜每层的格子数Const n=9 ′n表示物品的组数′f(i)存储第i个格子开始的同层连续的所有空格子数。f(i)为0表示第i个格子不是空格子Dim f(m) As IntegerDim a(n) As IntegerPrivate Sub Form_Load()′读取各组物品的个数依次存入数组a,并在List1中显示′代码略End SubFuncition getpos(r As Integer) As Ingeger′按格子编号从小到大的次序,查找空格子数≥r的第一个空区域′若找到,返回该空区域的起始编号,否则返回-1′代码略End FunctionPrivate Sub Command1_Click()Dim i As Integer,j As Integer,k As Integer,p As Integer,v As IntegerDim s As StringFor i=1 To mf(i)=w-(i-1) Mod w ′w为10,表示每层的格子数Next iv=1For i=1 To ns=”” p=__①__If p=-1 Then j=1 Do While j<=a(i) If f(v)<>0 Then s=s+Str(v)f(v)=0j=j+1 End If __②__ LoopElse k=(f(p))-a(i)\2 For j=k To 1 Step -1 f(p)=j p=p+1 Next j For j=__③__ f(j)=0 s=s+Str(j) Next jEnd IfList2. AddItem”第”+Str(i)+”组:”+sNext iEnd Sub答案 (1)1 2或1,2(2)①getpos(a(i))②V=V+1③p to p+a(i)-1解析 (1)第1组物品数是6个,可放置在第一层中间[3,4,5,6,7,8]位置。第2组物品数是2个,可以放置在第一层[1,2]位置。(由题干语句得知“格子编号由小到大的次序查找第一个可放置该组全部物品的空区域”)(2)根据p=-1语句可推断①处实现查找第一个可放置某组全部物品的空区域起始位置。观察代码,发现数组a的下标n表示物品的组数,a(i)表示第i组的物品数,①处的答案为getpos(a(i));根据解释语句“……返回该空区域的起始编号,否则返回-1”,p=-1说明没有足够的空区域,按零散放置的方式进行。若f(v)<>0,依次放置在v位置,根据s=s+Str(v),说明是一个个放入的,②处的答案为v=v+1;根据语句f(j)=0判断,该段代码“For j=③……Next j”应实现放入的物品后,将数组变量f(j)更新为0。若第一组物品数a(1)的值为6,语句k=(f(p)-a(i))\2执行后,k的值为2,代码“For k To 1 Step -1……Next j”实现将左侧数组变量f(1)更新为2,将f(2)更新为1,p的值为3,指向该组物品放置的首位置,因此物品放置的尾位置为首位置+物品数-1,③处的答案为p To p+a(i)-1。【变式4】 数组a中有n个正整数,对该数组进行排序,生成左右交替上升数据序列。实现该功能的VB程序段如下: t=a(j): a(j)=a(j+1): a(j+1)=tEnd IfNext jNext i上述程序中方框处可选语句或表达式有:①For j=i+1 To n-i+1 ②For j=i+1 To n-i ③a(j)a(j+1)则(1)、(2)、(3)处语句依次是( )A.①、②、③ B.①、②、④ C.②、①、③ D.②、①、④A解析 本题主要考查冒泡排序和选择排序的算法思想。从比较对象a(j)考点三 多关键字或多条件排序【例4】 有一组正整数,要求仅对其中的素数进行升序排序。排序后素数在前,非素数在后。排序示例如下。排序前 86 71 5 41 81 79 37 89排序后 5 37 41 71 79 89 86 81实现上述功能的VB程序如下,但加框处代码有误,请改正。Const n=8Dim a(1 To n) As IntegerPrivate Sub Command1_Click() Dim i As Integer,j As Integer,k As Integer,t As Integer Dim flag As Boolean ′读取一组正整数,存储在数组a中,代码略If IsPrime(a(k)) Then flag=True Else flag=FalseFor j=i+1 To n If IsPime(a(j)) Then k=j flag=TrueEnd If End IfNext jIf k <>i Thent=a(k): a(k)=a(i): a(i)=tEnd IfIf Not flag Then Exit For ′Exit For表示退出循环 Next i ′依次输出排序后的数据。代码略End SubFunction IsPrime(m As Integer) As Boolean ′本函数判断m是否是素数:是素数返回值为True,不是素数返回值为False ′代码略End Function答案 (1)k=i(2)Not flag Or a(j) 解析 交换两个数的语句出现在外循环中,说明是选择排序,变量k表示每趟排序中的最值,因此k的初值是i。题目是要求仅对其中的素数进行升序排序,因此比较的对象a(k)还要求是素数。【变式5】 有一组正整数,要求仅对其中的偶数进行降序排序。排序后偶数在前,奇数在后。排序示例如下。实现上述功能的VB程序如下,但加框处代码有错,请改正。Const n=8Dim a(1 To n) As IntegerPrivate Sub Form_Load() ′排序前数据存储在数组a中,并在文本框Text1中显示代码略End SubPrivate Sub Command1_Click()Dim k As Integer,i As Integer,j As Integer,t As Integeri=1Do While i <=n-1 k=i For j=i+1 To n k=j ElseIf a(k) Mod 2=0 And a(j) Mod 2=0 And a(j)>a(k) Then k=j End If Next j If k <>i Then t=a(k): a(k)=a(i): a(i)=t End IfLoop′依次输出排序后的数据。代码略End Sub答案 ①a(k) Mod 2=1 And a(j) Mod 2=0 ②i=i+1解析 k位置(最小数位置)上的数应具备两个特征,该位置上是偶数,j位置上是奇数,或都是偶数,但k位置上的数比j位置上的数小。考点四 奇偶位分别选择排序把握每趟排序的左边界和右边界,以及相邻元素的表示方法。【例5】 依据选择排序算法思想:设计一个对数组a中偶数位置上的元素进行降序排序,奇数位置上的元素进行升序排序的程序,实现该功能的VB程序段如下:Const n=10Dim a(1 To n) As Integer′10个数组元素依次存入a(1)到a(10),代码略For i=1 To n-1k=iFor__________________If i Mod 2=0 Then If a(j)>a(k) Then k=jElse If a(j)End IfNext jIf k <>i Then t=a(k): a(k)=a(i): a(i)=tNext iFor i=1 To nList2.AddItem Str(a(i))Next i上述程序中划线处可选语句为( )A.j=i+1 To n B.j=i+2 To n Step 2C.i=i+1 To n Step 2 D.i=i+2 To n解析 奇偶位前后相差2,因此内循环从i+2开始步长为2往后找,才能找到下一个奇数或下一个偶数上的数。B【变式6】 有如下VB程序段:s=”8641237590”:n=Len(s):Count=0For i=1 To n-1a(i)=Val(Mid(s,i,2))Next iFor i=1 To n-2 Step 2k=iFor j=i+2 To n-1 Step 2 If a(j)Next jIf k <>i Thent=a(i): a(i)=a(k): a(k)=tCount=Count+1End IfNext iLabel1.Caption=Str(Count)该程序段运行后,Label1中显示的内容是( )A.1 B.2 C.3 D.4解析 从a(i)=Val(Mid(s,i,2))中得到a(1)到a(9)的值依次为“86,64,41,12,23,37,75,59,90”;再从下面程序两个循环中可以看到是一个选择排序,得到升序序列;从step的值中可知道,这其实是关于奇数项的排序,与偶数项无关;Count变量的作用是记录交换次数的。B考点五 选择排序优化在一趟排序中,找出两个最值,分别放在两端,实现快速排序。【例6】 小赵对选择排序算法进行了如下改进:在数组的所有元素中找出最小和最大数据的元素,然后将这两个元素分别与第一个和最后一个元素交换数据,在余下的元素中找出最小和最大数据的元素,分别与第二个和倒数第二个元素交换数据,以此类推,直到所有元素的数据按升序排列。小赵编写的VB程序段如下:p=1: q=10Do While piMin=p: iMax=pFor i=p+1 To qIf a(i)If a(i)>a(iMax) Then iMax=iAt=a(iMax): a(iMax)=a(q): a(q)=tp=p+1q=q-1Loop要使程序实现上述算法思想,则方框中的语句是( )A.If iMax=p Then iMax=iMin B.If iMin=p Then iMin=iMaxC.If iMax=p Then iMin=iMax D.If iMin=p Then iMax=iMin解析 该算法是对选择排序算法的改进,由原来的找到最大数(或最小数)后从一个方向排序改为从最小和最大两个方向同时进行排序;每趟排序a(iMin)为找到的最小数,a(iMax) 为找到的最大数;最小数a(iMin)和a(p)交换,排到前边,然后最大数a(iMax)和a(q)交换,排到后边,实现升序排列;在每一趟循环中,如果没有方框中的语句,在a(p)恰好为最大数a(iMax)(即imax=p)时,因为最小数a(iMin)和a(p)先进行交换,交换后a(iMax)会变成最小数,a(iMax)和a(q)再进行交换会把最小数交换到a(q)而出现错误;方框中的语句应为避免这一错误的语句,A正确。分析程序时可以从待选项中获取线索。【变式7】 双向选择排序算法。在经典的选择排序基础上,如果在选择出最小数的同时,也能选择预见最大数并将两数放置合适位置,这样就使排序效率提高一倍。依照上述双向选择排序的算法,小张编写了一个VB程序,功能如下:在列表框List中显示排序前数据,单击“排序”按钮Command1,在列表框List1中显示这些数据按升序排序后的结果。运行效果如上图所示。实现上述功能的VB程序如下,但加框处代码有错,请改正。Const n=10If b(j) t=b(i):b(i)=b(j):b(j)=tEnd IfIf b(j)>b(n-i+1) Then t=b(j):b(j)=b(n-i+1):b(n-i+1)=tEnd IfNext jNext i答案 ①n\2 ②n-i+1解析 由于一趟实现了两个数字有序,因此只需排n\2即可,每趟排序的左边界是i,右边界是i的对称位置n-i+1。1.(2020·11月温州)下列VB程序段功能为:在文本框Text1中显示整型数组元素a(1)到a(10)中的最小值和次小值。k1 = 1: k2 = 10For i = 2 To 10If a(i) < a(k1) ThenEnd IfNext iText1.Text = Str(a(k1)) + ”,” + Str(a(k2))上述程序中方框处可选语旬为:①k1 =i ②k2=i ③k2=k1则(1)(2)(3)处语句依次是( )A. ①②③ B.③①② C.②①③ D.③②①解析 从输出语句可知,数组元素a(k1)和a(k2)表示最小值和次小值。语句“If a(i)B2.(2020·5月稽阳)对一个有n个元素的数组进行排序,下列说法正确的是( )CA.采用冒泡排序最多需要比较n* (n+1)/2次B.采用冒泡排序肯定比采用选择排序交换的次数多C.采用冒泡排序时,若发现某轮没有数据交换,可提前完成排序D.采用选择排序时,每轮完成一头一尾两个元素的排序,可减少总交换次数解析 本题考查排序的算法思想。A项冒泡排序需要比较n*(n-1)/2;B项冒泡排序一般比选择排序交换次数多,但极端情况下两者交换都可以为0次;D项选择双向排序可减少循环轮次,但不能减少交换次数。3.有如下程序段:i=1Do While i <=6a(i)=Int(Rnd*10)+1If a(i) Mod 2=i Mod 2 Then i=i+1LoopFor i=1 To 2k=1For j=1 To 6-i*2If a(j)*k>a(j+2)*k Then t=a(j): a(j)=a(j+2): a(j+2)=tEnd Ifk=-kNext jNext i执行该程序段后,在下列选项中,a(1)~a(6)各元素值可能的是( )A.1,8,3,4,9,4 B.9,4,3,4,1,8C.1,3,4,4,8,9 D.9,8,4,4,3,0解析 本题考核的知识点是程序的控制结构。产生的数组中数在[1,10],且偶数位上数必然是偶数。对产生的数进行按奇数位和偶数位分别排序,当j是奇数时k=1,当j是偶数时k=-1,因此奇数是升序排序,偶数是降序排序。A4.(2020·11月台州)依据选择排序思想:设计一个对数组a进行剔除重复数据后升序排序的程序。实现该功能的VB程序段如下:i = 1bottom = n ′n为a数组元素的个数Do While i <= bottom - 1k = iFor j = bottom To i + 1 Step -1If a(j) < a(k) Then k = jElseIf a(j) = a(k) Then If ____(1)____ Then ____(2)____ Else ____(3)____ bottom = bottom - 1End IfNext jIf k <>i Then t = a(k): a(k) = a(i): a(i) = ti = i + 1Loop上述程序中方框处可选语句为:①k=j ②k=bottom ③a(j)=a(bottom)。则(1)、(2)、(3)处语句依次是( )A. ②①③ B.②③① C.③①② D.①②③解析 此题考查选择排序算法思想。外循环表示排序次数,内循环则表示在i+1到bottom个元素中查找最小值所在位置k并去重。若出现a(j)=a(k)则表示出现重复数据,由于每趟是从后往前查找,因此出现重复数据时,把最后一个数据a(bottom)赋值给a(j),同时有效数据的个数bottom减少一个,下次不再参加排序。当k=bottom时,说明当前最小值所在位置k刚好是最后一个元素,则需更新最小值所在位置k(k=j)。A5.有如下程序段:For i = 1 To 2k = iFor j = i + 1 To 5If d(j)>d(k) Then k = jNext jt = d(k)For j = k To i + 1 Step -1d(j) = d(j - 1)Next jd(i) = tNext i数组元素a(1)到a(5)的值依次为“6,3,2,7,5”,经过该程序段“加工”后,数组元素a(1)到a(5)的值依次为( )A.7,6,2,3,5 B.7,6,6,2,5C.7,6,3,2,5 D.7,6,5,2,3解析 本题考查选择排序和插入排序的算法思想。外循环i表示排序的趟数,共排了2趟。在每趟中,先找出[i,n]之间的最大值的位置并把这个最大值存储在变量t中,再将[i,k-1]之间的数据往后移动,把最大值放在d(i)中。第1趟,找到最大值位置4,再把前面3个数往后移动,最大值放在d(1)中,结果为7 6 3 2 5。第2趟找到最大值位置2,没有移动数据位置。C6.有如下VB程序段:s = ”7218634”t = 0: n = Len(s)For i = 1 To n - 1a(i) = Val(Mid(s, i, 2))Next iFor i = 1 To n - 2 Step 2k = iFor j = i + 2 To n - 1 Step 2If a(j) < a(k) Then k = jNext jIf k <>i Thentemp = a(i): a(i) = a(k): a(k) = temp: t = t + 1End IfNext iText1.Text = Str(t)该程序段运行后,文本框Text1中显示的内容是( )A.1 B.2 C.3 D.4解析 本题考查选择排序的算法思想。字符串中有7个数字,从左到右每2个数字依次存储在数组a(1)至a(6)中。外循环变量i的值依次为1,3,5,内循环变量j的位置也是从i+2开始,每隔2位进行比较,因此只对6个数中的奇数位上数72,18,63进行升序排列,因此交换的次数为2次。B 展开更多...... 收起↑ 资源预览