Game Maker Studio 2中如何在快速排序中集成SPEED宏实现角色速度排序
解决方案
核心修改点如下:
- 原快速排序代码直接对比列表元素本身,需替换为读取元素的
current[SPEED]属性进行比较,保持和冒泡排序一致的降序逻辑 - 适配GML中ds_list的
|访问符,补全临时变量的var局部声明避免作用域污染 - 修正原递归边界逻辑,避免死循环崩溃
修改后完整代码
分区函数
function partition(list, low, high){ var pivot = list[|high]; var pivot_speed = pivot.current[@SPEED]; var i = low; var swapped; for (var j = low + 1; j <= high; j++) { // 使用SPEED宏读取速度值对比,保持降序逻辑 if (list[|j].current[@SPEED] > pivot_speed) { i++; swapped = list[|i]; list[|i] = list[|j]; list[|j] = swapped; } } // 将基准元素交换到最终排序位置 swapped = list[|i]; list[|i] = list[|high]; list[|high] = swapped; return i; }
快速排序主函数
function quicksort(list, low, high) { if (low < high) { var partition_ref = partition(list, low, high); // 修正递归边界,排除已排好的基准元素 quicksort(list, low, partition_ref - 1); quicksort(list, partition_ref + 1, high); } }
调用示例
和你原有冒泡排序的入参完全兼容,直接传入global.units即可:
var unit_count = ds_list_size(global.units); if (unit_count > 1) { quicksort(global.units, 0, unit_count - 1); }
内容的提问来源于stack exchange,提问作者Matt Moissat
相关产品推荐
相关产品推荐

