全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑   x" d  f* ?( K* s+ n

, P- @5 N* W" C: m2 O# w9 y此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。7 M- @# [" R* B$ K) t. K
本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/' t0 H6 v) Y# z4 o  ^' n+ N
  2. treenode item = param(1);. N% U0 r; r; E# V) b* d
  3. treenode current = ownerobject(c);
    . F+ F+ y. t) i: ~7 N9 t& R! j3 ^
  4. int port = param(2);
    ) i2 F# J1 E+ j" d! q  Q8 D

  5.   e% `" W, C0 ]% K* i
  6. int Ascending = 1;
    ! }* R$ {4 `0 T# g2 g! V
  7. int Descending = 2;8 s# ~, |% m* H. s) v) X; Y3 d
  8. int order = Descending;6 e3 |" c4 ?- }) X$ X1 e
  9.   |3 Z1 u8 |; d: g( h) Z3 L; w
  10. double currentlabel = getlabel(item, "remaintime");) v9 z* N1 Q6 Y# A1 L
  11. int maxrank = 1;3 B9 S$ u8 @# u) ~- e  E5 I
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。4 `1 z! ^" C% l
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。
    7 h8 C1 K8 }$ k0 d6 v; l
  14. for (int i = 1; i <= content(current); i++) {% ]/ G3 |6 p( I' r5 b! X: w
  15.         treenode cmpareitem = rank(current, i);5 N7 A: M. o/ ^8 ]( ]# [; N
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");+ u7 ~2 C; x( ?5 J$ R& e
  17.         if (order == Ascending) ; x, o! z& d3 B# L/ c. \
  18.               {  if (comparelabel > currentlabel)        break;}& j1 S1 \3 e& ^3 y- Y/ c, D
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值: A7 K5 j/ r! q, F, P
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环( b% V2 i  @: g, q" W. h: J
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++3 g0 \; g$ Z4 ]+ _& X
  22.         else if (comparelabel < currentlabel)  break;
    7 k0 M6 C( }" r: R
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。. K- W  r! j5 f- q+ O
  24.         maxrank++;
    0 }2 U- u! d% e- z8 ]+ b
  25. }/ Z, L! y; _" A. ?' Y1 [# n7 O* ]
  26. setrank(item,min(maxrank, content(current)));
    ( K+ r/ j$ q6 Z4 e+ m; S% v
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。
$ U1 D  B( w" G- f+ T' K# k; z' A因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。
- l, z* A2 @, `" [0 l9 D% I举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。
# R- ~/ M' V, x* e) Z0 _而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。
# `$ v, |/ h% q) I3 X/ z. b感谢加老师分享。
' t5 }7 J6 B# C7 A' U/ {5 x3 Q有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-9-6 12:35 , Processed in 0.063217 second(s), 13 queries .

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

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