全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑 0 p" g3 ^- R. R
: r  ?0 Q* |1 s+ H3 ^* |$ N
此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。5 p3 y' v! m; P* I" \8 {. Q, `
本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/+ ^* \5 Z- |" \+ P
  2. treenode item = param(1);' h0 j% Y0 p6 B, L# B
  3. treenode current = ownerobject(c);
    , A9 O+ a3 p2 z5 i
  4. int port = param(2);
    2 h/ F; N8 W# b& N' H' U

  5.   v& T4 A9 ]9 E7 e4 I/ s; X! G
  6. int Ascending = 1;* d8 I- f! x" n* G( K# M
  7. int Descending = 2;
      ]. x" Q+ i9 q% S  X! @0 b
  8. int order = Descending;; D; B* D0 g7 P" R

  9. 6 f% s# \1 |2 G  w. n7 s
  10. double currentlabel = getlabel(item, "remaintime");
    ' d! X8 w' J" S8 \
  11. int maxrank = 1;" _) B- Q2 |9 G- g" k& m
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。
    2 Y, i' h4 t1 {  }6 z2 B* h
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。/ H/ X# E8 K( C, x6 z( @: V
  14. for (int i = 1; i <= content(current); i++) {
    ; e0 b* t9 A8 G5 k% \$ J1 U5 P
  15.         treenode cmpareitem = rank(current, i);
    ' i" Y- ]0 L( J
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");8 c) t2 i+ \/ F! G& T$ f& j
  17.         if (order == Ascending) 8 @/ B& B/ e+ c& I8 ~; j
  18.               {  if (comparelabel > currentlabel)        break;}! `- F- r# F( m! u6 C
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值( Q6 E& J7 R6 N
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环* i6 _% e* S5 ]1 q. b. k
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++
    " B6 {- o5 P2 O" c( _
  22.         else if (comparelabel < currentlabel)  break;
    / J3 _: o: L$ t8 N! o
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。9 ^  {$ h( p6 Q- Y
  24.         maxrank++;1 ]. u+ y# r+ B" ?( n0 [  ~
  25. }5 Z8 H* z( N: V0 t8 W* P$ H
  26. setrank(item,min(maxrank, content(current)));
    , l7 t3 X: U. o+ ?; c  p2 e" ~) p
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。' {. V9 L* S) r) j3 w; C
因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。
! V5 K1 z* Z9 `5 i* b, d举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。3 m$ z& Q. s; G# T
而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。4 {* v! G% X2 W0 C$ m4 R) W2 g
感谢加老师分享。
2 r- b' q* a' D4 L- V$ v有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-30 09:02 , Processed in 0.075014 second(s), 13 queries .

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

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