全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑 $ c: W3 D" r) i' K- g' ?

- f, a; G9 h; g& [/ S% a此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。5 k8 C! X6 `/ g
本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/% a, B: C& q/ a- d+ ^
  2. treenode item = param(1);; g6 V! o& p3 T( h5 \
  3. treenode current = ownerobject(c);
    / [7 A! i1 q! }
  4. int port = param(2);
    . M" c6 z' R. V! z) U1 ]

  5. 4 z2 y0 L+ _9 l  |' o- n8 B
  6. int Ascending = 1;
    4 h3 [, `7 K: ^" H1 P. e1 Q: C- y5 V
  7. int Descending = 2;; Z2 v. D4 _& t  ]' Y- h
  8. int order = Descending;* U2 v4 f* f9 l. R
  9.   |% T  y1 J3 t; J! G0 J
  10. double currentlabel = getlabel(item, "remaintime");
    2 T6 a: a" Z% k0 c2 E! k  B& g
  11. int maxrank = 1;0 u- `2 `3 A" G; p) [* }; I
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。( ~% w. W- W4 t' j, j
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。, v) d( Z. D* |2 |- H5 R% {" c1 F- q/ y
  14. for (int i = 1; i <= content(current); i++) {1 ], s& B4 E- A
  15.         treenode cmpareitem = rank(current, i);  O: p3 F( k& U' O+ ~
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");( n1 [$ o' N, b
  17.         if (order == Ascending)
    + \6 U9 [8 X! N) k
  18.               {  if (comparelabel > currentlabel)        break;}8 S) C0 K: d/ ?7 s4 h+ J
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值' o# b  P8 p5 M  D
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环" R  {' ]7 [! ~" `5 A0 W
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++0 M9 D) i0 i8 R. b0 L
  22.         else if (comparelabel < currentlabel)  break;
    # g, M) x7 c3 l
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。  J) J( V* l* A5 \
  24.         maxrank++;
    2 c# S0 T$ S* {# }4 [  S
  25. }, |' w! c( t$ j( a5 F
  26. setrank(item,min(maxrank, content(current)));
    1 _3 Y6 A/ U8 x, _; p3 {+ X
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。+ t  x# Q+ @; h5 Q; C2 Q# N4 Q% v
因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。7 ~9 o: [' d3 U3 P, g3 |
举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。
* R9 U3 w; f; W; l! z* p" G而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。
, l9 q8 ^; s' F2 d! z& I. i感谢加老师分享。0 z# c1 v' u+ Y" j- p3 k, L5 r
有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

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