使用 Game Maker Studio 2 中的快速排序算法对列表进行排序

Posted

技术标签:

【中文标题】使用 Game Maker Studio 2 中的快速排序算法对列表进行排序【英文标题】:Sorting a list using the quicksort algorithm in Game Maker Studio 2 【发布时间】: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 宏。也许这是那些有明显答案但我看不到的问题之一。

谁能帮帮我?

【问题讨论】:

【参考方案1】:

与利用该语言中已有的内容(并且是用本机代码而不是稍慢的 GML 编写)相关的一般选项是:

array_sort 与自定义比较器函数一起使用 将感兴趣的主题连同他们的“分数”一起放入ds_grid,并使用ds_grid_sort(score &lt;&lt; 32) | id 放入 ds_list 并使用 ds_list_sort(如果源列表/数组包含结构,则在其中使用索引)。

至于您的快速排序,var pivot = list[high]if (list[j] &gt; pivot) 需要考虑项目的得分(速度),而不是“按原样”获取/比较它。

【讨论】:

以上是关于使用 Game Maker Studio 2 中的快速排序算法对列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Game Maker Studio 2 中跟踪随机遭遇的步骤

我在 Game Maker Studio 2 上的程序没有显示货币符号(如 £、$ 等)

Game Maker Studio,脚本参数不响应变量

Game Maker Studio的位置问题

XBOX 在插槽 0 中检测到一个游戏手柄,但在 Game Maker Studio 2 中未检测到输入

Game Maker Studio:前 10 名高分(认真)