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

Sorting a list using the quicksort algorithm in Game Maker Studio 2

提问人:Matt Moissat 提问时间:10/31/2021 更新时间:11/29/2021 访问量:492

问:

我正在使用 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];

当我调用我的气泡排序函数时,我使用一个参数,这是一个包含所有已生成的生物的 ID 的列表。通过 ,人们可以访问他们的速度,如上面的气泡排序算法所示,第 j 个生物。global.unitsglobal.units.current[@SPEED]

我写了一个快速排序算法。下面是分区和函数本身。

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 宏实现到我的快速排序算法中。也许这是那些有明显答案的问题之一,但我看不到。

谁能帮我一把?

快速排序 game-maker-language

评论


答:

2赞 YellowAfterlife 11/29/2021 #1

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

  • 与自定义比较器功能一起使用array_sort
  • 将感兴趣的主题与他们的“分数”一起放入并使用ds_gridds_grid_sort
  • 放入一个ds_list并使用(如果源列表/数组包含结构,请改用其中的索引)。(score << 32) | idds_list_sort

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