起因:
今天看VB.NET视频,听到老师说了这样一句话:“80%的面试都会考到冒泡排序。”这时才对它重视起来。
分类:
排序方法一般可分为:筛选法排序、直接排序、冒泡排序三种。
回忆:
大家还记得吗?学习VB的时候,米老师给我们形象的讲解过筛选法排序和冒泡排序。我还隐隐约约的记得老师给我们画了一个直角三角形:
关于具体内容可能大家也跟我一样印象模糊了。没关系,在跟我来回顾一遍吧!
一、筛选法排序
描述:第一轮将A(1)与A(2)比较,若A(1)<A(2),则交换A(1)和A(2)的值;再将A(1)与A(3)、A(4)……A(N)依次按照以上规则比较和交换,第一轮完毕,N个数中最大数存放在A(1)中。
第二轮将A(2)与A(3)、A(4)……A(N)依次按以上规则比较和交换;
第三轮将A(3)与A(4)、A(5)……A(N)依次按以上规则比较和交换;
第N-1轮将A(N-1)与A(N)按以上规则比较排序完成。
例如:
<strong><span style="font-size:18px;">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 </span></strong>二、直接排序
描述:第一轮将Pointer=1,A(Pointer)与A(2)比较,若A(Pointer)<A(2),则Pointer=2;再用A(Pointer)与A(3)……A(N)比较;看是否改变了Pointer的大小,如果改变了,则将A(Pointer)与A(1)互换。
第二轮将Pointer=2,A(Pointer)与A(3)比较,若A(Pointer)<A(3),则Pointer=3;再用A(Pointer)与A(4)……A(N)比较;看是否改变了Pointer的大小,如果改变了,则将A(Pointer)与A(2)互换。
……
例如:
<strong><span style="font-size:18px;">For I = 1 To N-1 Pointer=I For J = I+1 To N If A(Pointer) < A(J) Then Pointer=J End If Next J If I<>Pointer Then T=A(I) A(I) = A(Pointer) A(Pointer)=A(I) End If Next I </span></strong>三、冒泡排序
描述:第一轮将A(1)与A(2)比较,若A(1)>A(2),则交换A(1)和A(2)的值;再将A(2)与A(3)比较,方法相同;以此类推,直到A(N-1)与A(N)按照以上规则比较后,第一轮完毕,N个数中最大数存放在A(N)中。
第二轮将A(1)与A(2)、A(2)与A(3)……A(N-2)与A(N-1)依次按以上规则比较和交换;
第N-1轮将A(1)与A(2)按以上规则比较排序完成。
每一个的比较后都会使小数逐渐浮起来,大数下沉,就像冒泡一样。
例如:
<strong><span style="font-size:18px;"> For m = 10 To 2 Step -1 For n = 1 To m - 1 If a(n) > a(n + 1) Then t = a(n) a(n) = a(n + 1) a(n + 1) = t End If Next n Next m</span></strong>
总结:
无论是学习什么语言,都会用到这三种排序的方法,记是永远记不住的,我们只有多看,多想,多用,才能掌握。首先要把这三位区分开,我个人觉得比较代码的不同比较好理解。例如:(1)筛选法中是用A(I)和A(J)比较;(2)冒泡中是用A(J)和A(J+1)比较;(3)直接排序中是用指针A(Pointer)与A(J)比较,而且与前两个不同的是交换的是Pointer与I的值,而不是数组的值。
三大排序方法就回顾到这里,有说错的地方还请各方神圣指出。