快速排序插件

快速排序插件

为自定义排序用例提供接口

Utilities

该插件将为模组脚本提供使用当前最高效(在速度和内存占用方面)的排序算法的能力。

它不会修改游戏中的任何参数或内容。此模组仅面向开发者使用。


[u]以下说明面向计划使用此模组的模组开发者:[/u]

模组开发者可通过调用 quicksort 脚本使用该排序器。它将升序排列输入的 [i]objects[/i] 列表(依据给定的 [i]values[/i])。

[u]使用示例:[/u]

<run_script name="'quicksort'">
            <param name="objects" value="$UnsortedObjects"/>
            <param name="values" value="$UnsortedValues"/>
            <save_retval name="sortedobject" variable="$SortedObjects" />    
            <save_retval name="sortedvalue" variable="$SortedValues" />               
</run_script>

其中 $UnsortedObjects 包含未排序的对象,$UnsortedValues 包含用于排序的参照值。

  • $UnsortedObjects 可包含任意类型的任意值。
  • $UnsortedValues 必须包含浮点数或整数类型的值。
  • $UnsortedObjects$UnsortedValues 必须具有相同的条目数量。
  • $SortedObjects$SortedValues 在脚本执行完毕后将分别包含输入数据的排序结果。

[u]工作原理:[/u]

再举一个例子:
假设 $UnsortedObjects 包含以下数据:[wareY, wareZ, wareX]
$UnsortedValues 包含以下数据:[2, 3, 1]

两个列表中相同索引位置的元素相互对应(即排序算法将认为 $UnsortedObjects 的第一个元素 wareY 对应 $UnsortedValues 的第一个值 2,以此类推)。
这对于理解“所有元素将依据其对应值升序排列”这一规则至关重要。

[u]运行排序脚本后的结果:[/u]
$SortedObjects: [wareX, wareY, wareZ]
$SortedValues: [1, 2, 3]

元素现在已排序,$SortedValues 按升序排列,其对应的对象在配对列表中同步调整了顺序。
此方法适用于任意大小的列表。


[u]使用场景示例:[/u]

你想按货物容量(举例)对一组空间站进行排序。

操作步骤如下:

首先遍历你的空间站列表,构建用于排序的值列表:

      <create_list name="$UnsortedStationValues" />
      <do_all exact="$UnsortedStations.count" counter="$b">
         <append_to_list name="$UnsortedStationValues" exact="$UnsortedStations.{$b}.cargo.capacity.all"/>
       </do_all>

现在,我们已将所有值按与 $UnsortedStations 相同的顺序([b]重要[/b])存储在另一个列表中。
$UnsortedStations 的第一个元素对应 $UnsortedStationValues 的第一个元素,第二个元素对应第二个元素,以此类推。

接着运行排序脚本:

       <run_script name="'quicksort'">
            <param name="objects" value="$UnsortedStations"/>
            <param name="values" value="$UnsortedStationValues"/>
            <save_retval name="sortedobject" variable="$SortedStations" />    
            <save_retval name="sortedvalue" variable="$SortedStationValues" />               
       </run_script>

之后,$SortedStationValues 将包含升序排列的值,$SortedStations 的元素也相应调整了顺序。
如果再次遍历结果列表并输出空间站对象的 cargo.capacity 属性,你会发现它们已按升序排列。