卫泽刚张小丹* 赵军娣刘 飞钱 郁
(1.宝鸡文理学院物理与光电技术学院,陕西 宝鸡 721016;2.宝鸡高新凤师实验小学,陕西 宝鸡 721016)
Matlab和C语言都是面向工科专业开设的编程语言类专业基础课,相对于C语言,Matlab操作更方便,编程语法更简单,因此更易于学生学习。同时,Matlab也与其他编程语言有很多语法相通的地方,学好Matlab一方面可以提高学生的编程技能,加深对“软件程序”这一概念的理解,另一方面还能对学习其他编程语言起到理解促进作用。排序作为计算机软件数据处理中最基本的操作之一,已成为计算机编程语言学习的重要内容,其中对不同排序方法的理解与编程实现也是测试学生是否掌握编程语言学习的重要手段。因此,为了更好地使学生理解、掌握排序方法的排序过程,很多教学工作者研究了多种有效的教学手段。例如,张文慧着重分析了冒泡排序方法的特点,并以数据排序问题引导学生学会主动思考问题,并学会对问题进行总结归纳,培养学生独立思考与总结能力;曹春梅等通过引导学生对冒泡排序及其改进算法的学习,着重提高学生的程序设计能力,可为相关算法与程序设计方面的进一步学习和研究打下良好基础。本文针对非计算机专业Matlab语言与应用课程教学过程设计了循序渐进、由浅入深、难点分析、拓展练习的递进式选择排序教学过程,首先通过简单形象例子详细介绍了选择排序算法的过程,其次用Matlab进行编程代码实现,针对代码难点进行重点分析,最后设计了两个拓展练习题,加深学生对选择排序算法的理解,并培养学生根据项要求独立编写程序的能力。
选择排序算法是一种简单直观、易于学习的排序方法,其详细排序过程(以升序排序为例)为:对于待排序数据,首先遍历并比较所有数据,找到最小值后与第一个数据进行交换,此时第一个位置的数据就是所有数据中的最小值。然后再从第二个位置开始继续寻找最小值,与第二个位置上的数据进行交换。以此类推,直到所有数据处理完毕。由于每次都选择剩余数据中的最小值进行交换,因此称此方法排序为选择排序。
用一个简单的例子对选择排序过程进行详细讲解,加深学生对选择排序的理解。如图1所示,假如要对五个数据进行排序,五个待排序数据为:16、19、15、39、8。要求使用选择排序方法对它们进行升序排序。首先进行第一趟排序,选取所有数据中的最小值8,并与第一个位置上的数据16交换,此时第一趟排序结束。然后进行第二趟排序,从第二个位置开始选取剩余数据(19、15、39、16)中的最小值15,再与第二个位置上的数据19进行交换,此时第二趟排序结束,且前两个位置上的数据已排好序。然后进行第三趟排序,从第三个位置开始选取剩余数据(19、39、16)中的最小值16,与第三个位置上的数据19进行交换,此时第三趟排序结束,且前三个位置上的数据已排好序。然后进行第四趟排序,从第四个位置开始选取剩余数据(39、19)中的最小值19,与第四个位置上的数据39进行交换,此时第四趟排序结束,且前四个位置上的数据已排好序。第四趟排序后只剩下一个数据39,即为数据中的最大值,不需要进行额外操作,此时排序结束。图1共排序四趟,即可得到最终的排序结果:8、15、16、19、39。图1中绿色数字表示每一趟排序后已经排好序的数据部分。根据图1可以得出,若数据的总个数为n,则需要n-1趟完成对整个数据的排序。
图1 选择排序示例(绿色数字表示每一趟排序后已经排好序的数据部分)
通过上述对选择排序算法的过程分析和实例的详细图解,可以将选择排序每一趟操作过程总结为两个步骤:(1)在剩余未排序数据中找到最小值;(2)用最小值与未排序数据的第一个数进行交换。基于此,选择排序的操作就转化为在数据中寻找最小值后再与数据进行交换的问题。其中找最小值可以使用打擂台法,即按顺序和后面的数据依次进行数值大小比较,选出最小值。数据交换问题可以用Matlab的元素赋值操作完成。结合以上分析,选择排序的Matlab编程实现代码如下:
function out=selectSort(data)%输入待排序数据data,输出排好序的out
n=length(data);%求取待排序数据的总个数n
for i=1:n-1 %外循环,总的排序趟数:n-1
min_num=data(i);%每一趟先取第一个数据作为最小值
min_index=i;%存取最小值的索引位置
for j=i+1:n %打擂台法,与后面的数据依次比较大小
if min_num>data(j)%与每个数据比较大小
min_num=data(j);%存取最小值
min_index=j;%存取最小值的数据索引
end
end
temp=data(min_index);%提取最小值
data(min_index)=data(i);%数据交换
data(i)=temp;%数据交换
end
out=data;%输出排好序的数据
end
上述代码以函数定义的形式对选择排序算法进行编程实现,最直观地体现了选择排序的排序过程。其中有以下两处代码是学生难以理解的。(1)代码第四行最小值赋值,有很多学生不理解为什么最小值初值选取数据的第i个元素。主要原因在于没有理解排序算法每一趟最小值的选取问题。每一趟的最小值选取采用打擂台方法,即把当前值(min_num)先作为最小值,然后再与后面的数据“打擂台”,即依次比较大小,如果比当前最小值(min_num)小,就交换数据,否则不交换数据。通过与每个数据比较后即可将最小值选取出来。(2)数据交换过程(第12、13、14行)为什么要先定义一个临时变量(temp)而不是直接对两个数据进行赋值。这主要原因在于没有将Matlab的赋值操作与现实问题有效结合。学生们都能直观地理解交换两个数据的概念,但是将其用编程语言实现就需要一定的“技巧”,如果直接按照以下代码操作:data(min_index)=data(i);data(i)=data(min_index);,就会把原来data(min_index)数据丢掉,造成的结果就是data(min_index)和data(i)都变成同一个数据了。而通过提前定义一个临时变量temp,就可以将最小值data(min_index)先保存起来,再赋值给变量data(i),完成数据的交换。
为进一步提高学生对选择排序算法的理解与编程能力,在完全理解上述代码排序的基础上,增加以下两个问题让学生进行拓展训练:(1)在2.2节代码基础上修改,完成选择排序算法的降序排序过程,即将数据从大到小进行排序。(2)上述代码会改变原始数据的排列,如何新建一个同样大小的数组a,将每一趟选取的最小值依次放入数组a中并输出,以保证原始数据未被修改。第一个拓展练习题用类似的代码编程方式完成降序排序过程,可以加深学生对排序算法的理解。第二个拓展练习题可以提高学生的编程能力,如何根据项目需求进行思考,再将思考过程转化成具体的代码,同时可以让学生们深刻认识到,实现相同的排序功能,代码编写方式可以是不一样的。
Matlab是一门应用性很强的实践性课程,必须结合具体问题开展课程教学。本文以排序算法中简单直观的选择排序算法入手,采用分阶段、逐步递进、难点分析、拓展练习的思路对选择排序方法进行了详细介绍,由浅入深、循序渐进,针对学生难以理解的代码难点进行了深入分析,降低了学生用Matlab编写选择排序程序的难度。最后用两个拓展练习,强化学生对选择排序算法的理解,同时提高学生根据问题需求,编写代码解决问题的能力。