全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑 2 {: ]: l- H4 X( d5 {3 e  G
/ j$ j& V; e9 }4 i& A& s8 V
此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。* P8 a) l! H  T% b0 f2 ?  H6 S
本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/
    2 b4 x( c& O" c
  2. treenode item = param(1);
    " F% f$ l7 S' h: F# M
  3. treenode current = ownerobject(c);
    ( D4 Z, }& O: R+ L  Z+ z1 ^
  4. int port = param(2);
    $ i$ @: e  I7 O  Q& v3 j" \: O
  5. 2 B! J% D1 ]( G# L! i
  6. int Ascending = 1;
    0 c5 z- r: `5 j$ h3 o+ q
  7. int Descending = 2;
    1 V& N$ x+ C% H6 Q2 I
  8. int order = Descending;
    8 f* C+ p1 k% D2 l2 u7 M0 D

  9. ! M3 j9 p4 Z! F/ |8 f0 n
  10. double currentlabel = getlabel(item, "remaintime");
    & Q# p( X% B; I( F' B, e
  11. int maxrank = 1;  n* w/ D; S  }: D3 \; i& E# Y
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。7 w5 @6 o3 e- X! Z& q2 R) R4 B
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。8 a' D6 y* i, k4 w3 X' M
  14. for (int i = 1; i <= content(current); i++) {
      v! n% a) O) v, J: T, D5 y, T8 Z0 T
  15.         treenode cmpareitem = rank(current, i);# B$ R* N9 p0 x3 r
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");
    ; }( l( x  G4 N9 m% R7 X5 s0 \
  17.         if (order == Ascending) : @5 C& z% D9 n% ]6 m% X
  18.               {  if (comparelabel > currentlabel)        break;}/ B( w; k  ^* ]. j) j! i7 z$ D7 H% ?! j
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值0 x7 t* m1 |3 ^3 i
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环
    * j# b8 k  M; M' P7 T
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++5 \( a! y) f- y, r* e" X7 s
  22.         else if (comparelabel < currentlabel)  break;  W! f4 k' i/ z* u- x( q# S1 ]/ r
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。
    / r) ]. A# F- Y' s+ m3 o& `7 k
  24.         maxrank++;; g' |  b: E2 @4 p
  25. }/ p; Y9 @# i4 ?8 X6 L+ R1 D
  26. setrank(item,min(maxrank, content(current)));+ Y4 V8 K0 ~0 r! j
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。$ M. J5 ]) e# k" _, s) b$ z
因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。
3 R0 [6 M! n- @- c4 S9 U举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。& N2 h5 q: D$ [8 x
而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。
$ q7 t* C* n$ [& a+ B感谢加老师分享。) q2 k) D% z6 B+ F6 O: t* w
有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-9-6 14:39 , Processed in 0.084563 second(s), 14 queries .

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

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