排序的方法有很多种,今天介绍一下“冒泡法”排序。
冒泡法排序的原理:对相邻的元素进行两两比较,顺序相反则进行交换。这样,每一次会将最小或最大的元素“浮”到顶端,最终达到完全有序。
具体可参见上面的图示。下面用Scratch进行实现。
程序实现:下图是排序算法部分。
本例只对5个小球进行排序,所以循环上限是5次。
其中,列表“序号”中存放了需要排序的内容。变量i是外循环计数,循环次数为5;变量j是内循环计数,循环次数是5-i。
难点一:为什么内循环的次数是5-i?
由于是两两进行比较,所以第一次比较时,只需要比较4次就可以了。而第一次运行时,外循环变量i=1,所以这时5-1=4;
第二次执行内循环时,由于最大的已经冒泡到顶部,只剩下4个元素。这4个元素,也只要比较3次就可以。而这时外循环变量i=2,刚好5-2=3。后面的依次类推。
难点二:如何引用数组结构中的元素?
在Scratch中没有提供“数组”这种数据结构,但是提供了“列表”。数组可以通过列表来实现。
例如,有数组A,它有5个元素。则每个元素分别为A(1)、A(2)、A(3)、A(4)和A(5)。有的编程语言数组的下标从0开始,有的从1开始。有的编程语言支持对数组的整体操作,有的只能一个元素一个元素的访问。
Scratch中只有列表,所以只能通过下标,一个个的访问。
“交换”部分程序如下:
难点三:如何交换两个数据?
在程序中,两个变量必须通过第三个变量才能实现交换。因为在大部分编程语言中,等号的含义是“赋值”。
所以有的编程语言为了进行区分,将赋值号写成“:=”的形式。例如:
其含义是将100这个值赋予变量a。
因此直接写成下列形式,是不能交换变量a和b的值的:
执行第一条语句时,将变量b的值赋予了变量a,这时变量a的值已经等于变量b了。所以执行第二条语句时,只是再一次把值赋予变量b。变量a的值丢失了。
通常采用中间变量来实现交换。例如:
这里temp就是中间变量。注意其中的次序不能搞错。
让我们来看看静态的效果: