全球FlexSim系统仿真中文论坛

搜索
查看: 3480|回复: 1
打印 上一主题 下一主题

临时实体排列顺序代码解析

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑 * ]8 f5 d4 G. H* p: {' K4 g

  v* N" W* P! Z& u5 n此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。
$ u, d& J7 M% N% o3 ~7 P8 i本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/
    + N% Z3 ?8 Z" H1 p0 Q& b
  2. treenode item = param(1);
    " [' ]6 Y  t+ ]' T
  3. treenode current = ownerobject(c);
    2 M. [+ ]3 Z  F3 L3 R6 u) S
  4. int port = param(2);4 s8 c, b" M# R  x. e
  5. ' Q6 P% m" C& c3 z$ x" n" R
  6. int Ascending = 1;
    - m' l9 J9 t0 j
  7. int Descending = 2;+ V4 L5 s2 w2 ?8 D4 O
  8. int order = Descending;5 q# U; l6 \8 e: |
  9. : ~% P4 M3 B% g2 @! }
  10. double currentlabel = getlabel(item, "remaintime");7 p1 j/ _1 t5 [8 k& I2 n
  11. int maxrank = 1;' I/ z( S: Q# g5 b7 w3 X- g
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。
    7 C# M4 n1 z- L: ?& y% T( X: ?
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。9 d! o) P' w5 a
  14. for (int i = 1; i <= content(current); i++) {
    - X; F6 y/ H! A* c+ S/ U7 E/ s
  15.         treenode cmpareitem = rank(current, i);
    ) c& Z: C) p& M2 s# J' n
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");
    , T4 b- R( i- ^# {# o
  17.         if (order == Ascending)
    , o8 E9 m$ H# V8 Y6 B4 j
  18.               {  if (comparelabel > currentlabel)        break;}3 {6 ~7 ^% \* H" G8 f: w7 c* f
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值
    , E2 J% o+ N. a' A
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环% s# f" a( M8 V1 @7 e
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++" z) v$ K  z3 y8 P
  22.         else if (comparelabel < currentlabel)  break;
    ' D& f- r2 n0 I2 E! a1 C$ e' G
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。
    # z" r6 `- Y: t5 u
  24.         maxrank++;
      [" @( X) K' X  {5 y( X5 Z; V
  25. }
    1 W( [& Q! c+ x3 W9 T
  26. setrank(item,min(maxrank, content(current)));
    # e/ ~( A$ b+ n  @0 o
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。7 X1 B7 q, e8 f# d0 K
因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。/ i1 G# l5 o3 f' H
举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。$ U$ T' {% J+ @, ~: J4 s- ]7 u/ k
而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。) w( {% _8 y: c' e. z
感谢加老师分享。0 ]# T% J8 e( n# \4 z# y
有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|全球FlexSim系统仿真中文论坛 ( 京ICP备14043114号-2 )

GMT+8, 2025-6-30 17:19 , Processed in 0.075201 second(s), 13 queries .

Powered by Discuz! X3.3© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表