全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑
3 G% d& d+ H% V1 b2 `& y* l6 Y9 l8 T  C* k0 w
此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。
) z4 r7 U* f: H- P( s* y本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/
    ! {* L* z9 c: a
  2. treenode item = param(1);; x) e! ~0 J( b
  3. treenode current = ownerobject(c);2 [. }$ [  T% t, I
  4. int port = param(2);1 m4 e* |9 ~( {$ a; F
  5. : z  e( o6 E; P6 E  S1 h/ S: q
  6. int Ascending = 1;: a3 A7 M. b, K! t0 t/ n
  7. int Descending = 2;' l$ M5 w7 z" `
  8. int order = Descending;
    4 l# k& p$ s' A8 u% q7 m
  9. 8 [% z( b, i$ D- y
  10. double currentlabel = getlabel(item, "remaintime");+ `- c  z- l9 T& w  ]2 x
  11. int maxrank = 1;
    2 y, t5 s  M6 t
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。
    4 g; {) [( B( @0 F
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。
    5 t# b/ G- G: m  y) f: x4 s
  14. for (int i = 1; i <= content(current); i++) {- |+ K% y. d2 H$ _
  15.         treenode cmpareitem = rank(current, i);8 c" @- f6 V4 S9 D3 Z+ z
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");4 E- M7 D  F, c: H* U6 \! ~  \
  17.         if (order == Ascending)
    . s  A0 b4 g, t8 b  W- k
  18.               {  if (comparelabel > currentlabel)        break;}
    ) n# P- K6 f& a- g" e
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值. ]( V) n4 ]. k
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环' V6 \& Q/ g& P5 x* F) o
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++
    ; d+ w5 r8 H# q& I: K; l
  22.         else if (comparelabel < currentlabel)  break;
    $ S; H. h$ R6 ?
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。
    4 z% G2 Y7 n9 H/ {# d6 j$ p5 ^
  24.         maxrank++;
    - Y" F; g1 s. F3 U7 @1 e" ^
  25. }
    1 z" j$ t! S. A) A3 E* \
  26. setrank(item,min(maxrank, content(current)));9 x8 t/ S: q, P1 i$ M
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。
3 g; V+ v4 W# D% R因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。) G; s7 ]% w+ P2 }+ b7 A
举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。- w# _0 K1 E5 k' h
而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。
/ I. a: }6 R/ |4 I$ ^感谢加老师分享。
! X. N- E9 B$ C) Q有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-9-6 16:37 , Processed in 0.059626 second(s), 13 queries .

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

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