【发布时间】:2021-12-15 13:05:03
【问题描述】:
我正在使用 Game Maker Studio 2.3.6 使用迭代算法(冒泡排序)按降序对屏幕上的字符速度列表进行排序。但是,我计划在某些战斗中使用很多屏幕上的角色。因此,我考虑改用快速排序算法以减少运行时间。
这是我目前用来对速度值进行排序的简单迭代算法(用 GML 编写)。
function bubble_sort(list){
list_size = ds_list_size(list);
for (var i = 0; i < list_size; i++) {
for (var j = 0; j < list_size - i - 1; j++) {
if (list[|j].current[@SPEED] < list[|j+1].current[@SPEED]) {
var swapped = list[|j];
list[|j] = list[|j+1];
list[|j+1] = swapped;
}
}
}
}
我使用宏定义了速度值。
#macro SPEED 0
base[SPEED] = 10;
current[SPEED] = base[@SPEED];
当我调用冒泡排序函数时,我使用global.units 作为参数,它是一个包含所有已生成生物的 ID 的列表。通过global.units,您可以使用.current[@SPEED] 访问第j 个暴民的速度,正如您在上面的冒泡排序算法中看到的那样。
我写了一个快速排序算法。下面是分区和函数本身。
function partition(list, low, high){
var pivot = list[high]; // point de pivot autour duquel il faut modifier la liste
var i = low;
for (j = low + 1; j <= high; j++) {
if (list[j] > pivot) {
i++;
// on fait pivoter la liste en i et la liste en j
swapped = list[i];
list[@i] = list[j];
list[@j] = swapped;
}
}
// on fait pivoter la liste en i+1 avec la plus haute valeur
swapped = list[i];
list[@i] = list[high];
list[@high] = swapped;
return i;
}
在不同的脚本中,
function quicksort(list, low, high) {
if (low < high) {
partition_ref = partition(list, low, high); // on partitionne l'indice
// on trie les éléments de manière récursive avant et après la phase de partition des éléments
quicksort(list, low, partition_ref);
quicksort(list, partition_ref + 1, high);
}
}
在费了很多脑筋之后,我想不出如何在我的快速排序算法中实现 SPEED 宏。也许这是那些有明显答案但我看不到的问题之一。
谁能帮帮我?
【问题讨论】:
标签: sorting quicksort game-maker-studio-2 game-maker-language