全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑
# Z% @% e8 A* P, |5 o
  p# a1 v# R9 Z# q2 `; B6 m此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。
8 A# l: a2 t# H7 B4 O' ~本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/" y7 ]0 p7 E5 L, S
  2. treenode item = param(1);+ a! q" t2 s, d4 _8 C8 v' N1 N, g! U
  3. treenode current = ownerobject(c);: T" U9 v2 t. }* e9 T+ s( F
  4. int port = param(2);( w- j: l# j/ p# M0 c! }

  5. ; s* P% u# }  s' x# \# C2 C7 _
  6. int Ascending = 1;
    + k* G# W" o  M, b9 o
  7. int Descending = 2;7 A$ K, i, N* i( Y
  8. int order = Descending;
    % D" Q/ E; j) ^  i$ ^0 }
  9. 1 K0 Y6 q$ {8 x' x3 R+ }+ e  C: n! l
  10. double currentlabel = getlabel(item, "remaintime");6 k; }2 \  F  u, t( S
  11. int maxrank = 1;  A; L  Z5 f% G" ^* I
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。" V+ ?; M6 z  t" X! R0 ^
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。4 z1 v% @% k. n' h" c
  14. for (int i = 1; i <= content(current); i++) {, w& z! f, f# Z1 P) ]
  15.         treenode cmpareitem = rank(current, i);
    ) w" r5 a9 X/ L7 Y& \
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");# m* h, X! m* Y- r6 k
  17.         if (order == Ascending)
    6 D6 e- x9 R' B5 r  R! M
  18.               {  if (comparelabel > currentlabel)        break;}
    ' R0 h6 Q# u* s' |" h. i2 b, V
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值
    + R0 V1 F8 c/ |: Y
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环
    6 k% o, J( v- x5 F7 R
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++
    8 z. D9 N* h2 Y8 l
  22.         else if (comparelabel < currentlabel)  break;" @2 i) u7 B- o# a$ Y
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。
    ' l1 J' p! O2 H' @" F5 ?
  24.         maxrank++;
    4 J# ]7 b: a% w7 k* Z" K* p
  25. }. E4 l/ S# [" E$ f' f' N
  26. setrank(item,min(maxrank, content(current)));
    # M3 v4 ~% H. K9 n
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。0 n6 d3 b$ r; d3 v2 l
因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。% ^. L, \) y: e9 Z7 v8 y
举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。
/ M4 n8 \4 a6 R6 y* o" S8 N% y而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。
5 L1 H) u) F$ H0 @. e5 k感谢加老师分享。
7 E  m9 D; x2 j6 c. L( S- [有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

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