• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

返回列表 12345678» / 10
发新话题 回复该主题

[技术交流] 【院刊】-【201408期】游戏扫拍卖行(排序算法之冒泡法) [复制链接]

1#

排序算法之冒泡法—游戏扫拍卖行

作者:267-haiye(按键学院基础班学员) 编辑:果果。。


什么情况下会用到冒泡排序呢? 例如,学生考试成绩的排列,财务部门支出清单的排序……等等。实现将一堆凌乱无序的东西,按照从大到小或者从小到大的顺序排列好,同时也能得知其中的最大值和最小值。

今天呢,我们借助游戏中的拍卖行,来讲解下如何用冒泡排序来实现。

算法原理:

冒泡排序(BubbleSort)


冒泡排序是最慢的排序算法,但也是新手最容易上手的一个排序方法。在实际运用中它是效率最低的算法。它通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的数据上升。它是O(n^2)的算法。



算法的复杂度

有没有同学问,O(n^2)的算法是什么呢?这是其实是衡量算法速度快慢的一个指标,我们称之为算法的时间复杂度。时间复杂越大,算法的执行效率越低。

当然,并不是越快的算法,一定越好。算法还有另一个指标,叫空间复杂度,即算法占用多少空间,这个和内存息息相关。一个算法可能很快,但是它占用的内存多,不一定耗得起。

所以呢在不同的场合,我们需要根据不同的要求,会选择最合适的算法。


如何计算时间复杂度

时间复杂度,其实就是算法中某一语句循环执行的次数。

例如:冒泡排序法的原理

  1. For i = 1 To n
  2. For j = 1 To n
  3. 冒泡排序
  4. Next
  5. Next
复制代码
这个算法的时间复杂度,即“冒泡排序”这个语句的执行次数

当i=1的时候,For j = 1 To n:冒泡排序:Next,“冒泡排序”这个语句被执行了n次。

当i=2的时候,For j = 1To n:冒泡排序:Next,“冒泡排序”这个语句又被执行了n次。

当i=3的时候,For j = 1To n:冒泡排序:Next,“冒泡排序”这个语句又被执行了n次。

……

当i=n的时候,For j = 1To n:冒泡排序:Next,“冒泡排序”这个语句又被执行了n次。

综上,“冒泡排序”这个语句被执行了n个n次,即n*n=n^2次。所以冒泡排序的时间复杂度即为n^2,我们记为O(n^2)

注:1.如果算法中语句执行次数为一个常数,则时间复杂度为O(1)。

2.若一个算法的时间复杂度为O(n)=n^2+3n+4,我们只取算式中最高次方,即O(n^2)。


算法的实现

您所在的用户组无法下载或查看附件


算法讲解:


'冒泡排序
//经过n-1趟子排序完成的,它的时间复杂度为O(n^2)
//优点:1.代码简单易懂;2.具有稳定性

1.获取到物品价格,存入数组su

2.获取到数组的个数,即物品的总数,记为M

3.循环开始

4.获取到数组su(0)的数值

5.su(0)与数组中剩余的数值对比(su(1)-su(M)),若数值大于su(0),则相互调换

6.Su(0)存储数组中最大的值

7.循环到数组最后一个数值su(M)

8.结束第一次循环,数组的第一个元素su(0)为数组中最大值

9.从su(1) 到su(M),重复5-8步骤,实现su数组最后为从大到小的降序排列。




代码具体实现:

  1. Dim i,j
  2. su= "105875|502150|411400|63525|111925|90750" //获取到的物品价格
  3. su=Split(su, "|")
  4. M = UBound(su)
  5. //升序排序
  6. For i = 0 To UBound(su)-1 //i=0 的时候 j循环是从 1循环到数组最小不 第一轮循环,su(0)和su (1)-su(5)进行比较 选择6个数中最小的数放到su(0) 第二轮循环 su(1)和su(2)-su(5)比较
  7. For j = i+1 to UBound (su)
  8. If int(su(i)) > int (su(j)) Then // 数组是字符串的 所以需要用int改为数值型 否则会出现错误
  9. tran = su(j)
  10. su(j) = su(i)
  11. su(i) = tran //如果前一个数比后一个数大,就交换位置
  12. End If
  13. Next
  14. Next

  15. // 降序排序
  16. For i = 0 To UBound(su)-1
  17. For j = i+1 to UBound (su)
  18. If int(su(i))
  19. tran = su(j)
  20. su(j) = su(i)
  21. su(i) = tran //如果后一个数比前一个数大,就交换位置
  22. End If
  23. Next
  24. Next
复制代码
代码的每一次实现

原数组: "105875|502150|411400|63525|111925|90750"

第一次循环:
取su(0)的值105875,与su(1)对比。su(1)>su(0),则相互交换:

"502150|105875|411400|63525|111925|90750"

然后拿su(0)的值502150,与su(2)-su(5)对比,没有比su(0)更大的值,不再交换,结束。
第一次循环结束:"502150|105875|411400|63525|111925|90750"

第二次循环:

取su(1)的值105875,与su(2)的值411400对比,su(2)>su(1),则相互交换:

"502150|411400|105875|63525|111925|90750"

然后拿su(1)的值411400,与su(3)-su(5)对比,没有比su(1)更大的值,不再交换,结束。
第二次循环结束:"502150|411400|105875|63525|111925|90750"

第三次循环:

取su(2)的值105875,与su(3)的值63525对比,su(3)
su(2)的值105875与su(4)的值111925对比,su(4)>su(2),则相互交换:

"502150|411400|111925|63525|105875|90750"

然后拿su(2)的值111925,与su(5)的值90750对比,su(5)
第三次循环结束:"502150|411400|111925|63525|105875|90750"

第四次循环:

取su(3)的值63525,与su(4)的值105875对比,su(4)>su(3),相互交换:

"502150|411400|111925|105875|63525|90750"

取su(3)的值105875,与su(5)对比,su(5)
第四次循环结束:"502150|411400|111925|105875|63525|90750"

第五次循环:

取su(4)的值63525,与su(5)的值90750对比,su(4)>su(5),相互交换,循环结束。
第五次循环结束:"502150|411400|111925|105875|90750|63525"

此时数组已循环到最后,完成降序排列。




知识拓展


按数量级递增排列,常见的时间复杂度有:
常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),..., k次方阶O(nk),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。




附上大大写好的冒泡排序VBS,各位大大可以直接调用使用哦~~
您所在的用户组无法下载或查看附件

调用方法:
  1. Include "C:\冒泡排序.vbs" //地址是下载的冒泡排序vbs的所在地址
  2. maopao su,1 // 语法: maopao 数组名称,升序或降序(1是升序,2是降序)
  3. Sub Include(tz_var_file) //添加这段调用代码
  4.     Dim tz_var_fso, tz_var_f, tz_var_s
  5.     Set tz_var_fso = CreateObject("Scripting.FileSystemObject")
  6.     Set tz_var_f = tz_var_fso.OpenTextFile(tz_var_file)
  7.     tz_var_s = tz_var_f.ReadAll
  8.     Call tz_var_f.Close()
  9.     Call ExecuteGlobal(tz_var_s)
  10.     Set tz_var_fso = Nothing
  11. End Sub
复制代码



往期相关院刊:

【院刊】-【201408期】计算距离自己最近的怪物/包裹/金矿坐标
【院刊】-【201408期】比冒泡更快的排序算法(快速排序)



本文由按键学院提供技术支持
按键学院实战班(即将入驻最终幻想)火热招生
按键学院基础视频抢先观看


    已有7评分我要评分查看所有评分

    本主题由 超级版主 瑞祥幽冥狼 于 2023/7/23 18:21:35 执行 审核帖子 操作
    <strong>按键学院交流群(开放中):376122403<br />
    <br />
    <a href="http://bbs.anjian.com/thread-548439-1-1.html" target="_blank">按键学院开班<strong> <font color="Red">【安卓导师】+【实战导师】招聘导师</font></strong>啦~~<font color="Red"><strong>待遇特别好,有钱,就是任性。</strong> </font></a><br />
    <br />
    <br />
    <a href="http://bbs.anjian.com/t
    2#

    看看学习学习

    3#

    我要看

    4#

    冒泡排序

    5#

    2222222222222222

    6#

    学习学习学习学习学习!

    7#

    sadsadsaasd

    8#

    学习!!!!!!!!!!!!!!!!

    9#

    111111111111

    10#

    看看

    11#

    1212121212

    12#

    000000001111111112

    13#


    14#

    kankanttt

    15#

    kank@ngft

    16#

    123456

    17#

    多谢楼主分享

    18#

    学习

    19#

    刚给他

    20#

    感谢分享啊,又来看看哦

    发新话题 回复该主题