写在前面
辛苦米老师,给我们连续周六日,给我们讲了很长一段时间的算法,突然发现自己之前是很抵触算法的,光想想我的脑细胞就会死掉很多,但是老师的方法很独特,感觉自己好像突然打开一扇门似的,学习也可以这样有趣。
快乐学习
这里给大家分享几个关于排序的有趣视频,至少本人还是很喜欢看的,欢乐多多的:
- 冒泡排序
http://v.youku.com/v_show/id_XMzMyOTAyMzQ0.html - 选择排序
http://v.youku.com/v_show/id_XMzMyODk5MDI0.html?f=16755664 - 快速排序
http://v.youku.com/v_show/id_XMzMyODk4NTQ4.html?f=16755664 - 插入排序
http://v.youku.com/v_show/id_XMzMyODk3NjI4.html?f=16755664
原来学习方法是很重要的,好的东西大家就要一起分享,如果可以快乐的学习,我们何必为难自己。
选择排序
思路
选择排序的思想注重于对象,就是先假设一个变量中的数是最大的。这里我们用到的是一个,一个空间。
我们让假设的这个变量中的数(此时数与变量是一个整体)跟给每一个要排序的数进行比较。试排序的要求而定,我们可以将变量中的值对调,这是仍使用这个变量中的数(这是变量还是原来的变量,但是数就可能已经对调了)与下个对象进行比较。
直到我们假设的这个变量和所有的数都比较一遍,这是我们假设的这个变量就是一个已经排好的数了,下一次循环排序我们就可以不用管他了。
图片
- 图片说明
该图片进行一次外循环,进行了一遍内循环,循环的结果就是将最小的数 1找出来,放在a1的变量里。这个排序的要求是从小到大排,我们先假设a1中的5是最大的,第一次内循环:a1中的5跟7比较,比7小不用换;第二次内循环:a1中的5跟9比,依然不用换;第三次内循环,a1中的5跟2比较,这是2比5小,将a1中的值和a4中的值交换。注意下一次内循环时,a1中的值就已经是2了,接着跟后边的数比较,步骤类似,此处省略。
代码
- 产生随机的10个数
Dim p As String
dim a(10) as String
Randomize '每进行一次事件,产生的一批随机数不同
p = ""
'产生随机数了
For i = 1 To 10
Do
x = Int(Rnd * 90) + 10
flag = 0 '做标志,假设没有重复的数,flag即为0
'如果产生随机数与之前的随机数相同,则次数不计入总数,重新
'再产生一个随机数
For j = 1 To i - 1
If a(j) = x Then flag = 1: Exit For
Next j
Loop While flag = 1 '当flag= 1 时重新再产生一个数
a(i) = x
p = p & Str(a(i)) & ","
Next i
Label1.Caption = p
- 选择排序
Dim t As String
'确定外循环的次数
For i = 1 To 9
'确定内循环的次数
For j = i + 1 To 10
If a(i) > a(j) Then
t = a(i): a(i) = a(j): a(j) = t
End If
Next j
Next i
'显示
For i = 1 To 10
p = p & Str(a(i)) & ","
Next i
Label2.Caption = p
冒泡排序
思路
将相邻的两个数进行比较,按照排序的条件,将较大或较小的数冒泡。
外循环一次,内循环一遍,可以将一个数冒出来。
体会冒泡排序的过程性,对比选择排序的对象性。
图片
- 图片说明
该图进行的一次外循环,一遍内循环。按从大到小的顺序排列。首先让a1中的1和a2中的2比较,a1小,将a1和a2中的值对调。此时,a2中的1和a3中的3比较,a2小,将a2和a3中的值对调。一次类推,此时a6中的值变为1,相当于1冒泡出来了。
代码
Dim t As String
'确定外循环的次数,要冒几个数
For i = 1 To 9
'确定内循环的次数
For j = 1 To 10 - i
If a(j) < a(j + 1) Then
t = a(j): a(j) = a(j + 1): a(j + 1) = t
End If
Next j
Next i
'显示
For i = 1 To 10
p = p & Str(a(i)) & ","
Next i
Label2.Caption = p
插入排序
思路
插入排序是将一个数插入到一个有序的序列中,使得插完这个数后,这个数组仍是有序的。
插入排序算法的思想是把要排序的数分成两部分,第一部分,之前的原有数,和一个空位(不然没有空间的话,插入的这个数就没有地方了),第二部分,就是要插入的这个数。
将原有的数拍好序,最后将要插入的数,插入第一部分当中。
图片
- 图片说明
首先我们将要插入的数和原有数组的最后一个数比较,必要时再和数组内的数比较。图中是按从小到大的顺序排序的:
- 第一次排序,将27插入到53,那27和53进行比较,有序序列为:27,53;
- 第二次排序,将36和53比较,36较小,于是将a2中的53向后移动一位,变为a3中的53,36继续和27比较,大于27,36就插在了a1中27的后面,a2里面。
- 依次类推,到第四次排序,将69插入前面的序列中,因为69大于53,所以直接将69插在a5的位置中,不用和之前的数去比较了。
代码
'插入排序,从小到大,向有序的数中插入数
'外循环的次数 9 次,每插入一个数记为一次
For i = 2 To 9
If a(i) < a(i - 1) Then '比较要插入的数和最后一个数
Min = a(i)
For j = i - 1 To 1 Step -1 '内循环,插入数和内
'部的每一个数进行比较
If Min > a(j) Then Exit For '比不过
'小,就不用比了
'比得过小的时候,自然往后顺位
a(j + 1) = a(j)
Next j
a(j + 1) = Min '找到插入的数所在的位置
End If
Next i
For i = 1 To Val(Text1.Text)
p = p & Str(a(i)) & ","
Next i
Label2.Caption = p
结束语
算法其实想清楚,感觉挺有意思的,尤其是那个视频,好像是激起我内心中的某种东西似的,感觉很有趣。对比这三种算法,插入算法执行起来要简要一些,没有像选择排序和冒泡排序那样重复去比较,省了很多事,继续努力吧。

通过独特教学方式,让抵触算法学习的作者发现乐趣。本文分享了冒泡排序、选择排序、快速排序和插入排序的有趣视频及代码实现,强调好的学习方法能提高效率。
2154

被折叠的 条评论
为什么被折叠?



