简单排序--选择、冒泡、插入

来源:互联网 发布:电子显微镜原理 知乎 编辑:程序博客网 时间:2024/05/17 05:06

写在前面

辛苦米老师,给我们连续周六日,给我们讲了很长一段时间的算法,突然发现自己之前是很抵触算法的,光想想我的脑细胞就会死掉很多,但是老师的方法很独特,感觉自己好像突然打开一扇门似的,学习也可以这样有趣。


快乐学习

这里给大家分享几个关于排序的有趣视频,至少本人还是很喜欢看的,欢乐多多的:

  • 冒泡排序
    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 Stringdim 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

结束语

算法其实想清楚,感觉挺有意思的,尤其是那个视频,好像是激起我内心中的某种东西似的,感觉很有趣。对比这三种算法,插入算法执行起来要简要一些,没有像选择排序和冒泡排序那样重复去比较,省了很多事,继续努力吧。

9 0
原创粉丝点击