如何有效地确定数组中每个元素的等级(在平局情况下平均)?例如:
float[] rank(T)(T[] input) { // Implementation } auto foo = rank([3,6,4,2,2]); // foo == [3, 5, 4, 1.5, 1.5]
我能想到的唯一方法是分配3个数组:
有谁知道如何在O(N log N)时间和O(1)辅助空间中执行此操作(这意味着我们必须分配的唯一数组是要返回的数组),或者至少摆脱了其中一个上面的三个数组?
您可以分配要返回的数组(将其称为R),将其初始化为0..n-1,然后使用输入I [R [k]]与I [R [j]]而不是普通的R [k]与R [j],然后根据需要交换R数组中的值(而不是照常替换I数组中的值)。
您可以使用quicksort或heapsort(或bubbleort来实现这种间接排序),但这会增加您的复杂性。
您只需要分配一个数组-并为索引分配一些堆栈空间。