我有一个数组,想NaN
在原处对其进行排序。
例如:
B=[5,2,NaN,NaN,9,34,23,NaN,89];
输出应该是:
B_sorted=[2,5,NaN,NaN,9,23,34,NaN,89];
简单的解决方案是就地完成,而不是接触 NaN 元素
B=[5,2,NaN,NaN,9,34,23,NaN,89];
B(~isnan(B)) = sort(B(~isnan(B)))
或使用新数组:
B_sorted = nan(size(B));
B_sorted(~isnan(B)) = sort(B(~isnan(B)))
如果您在 Ruby 中执行此操作...
b=[5,2,'NaN','NaN',9,34,23,'NaN',89]
b_sort = (b - ['NaN']).sort
b = b.map{|x| x == 'NaN' ? 'NaN' : b_sort.shift}
即使您为每个 x 定义 compare(x, NaN)=0,仅使用不同的比较方法进行排序也是行不通的。我认为,合并排序和快速排序都会移动你的 NaN。
我认为您需要过滤非 NaN 值,对它们进行排序,然后覆盖非 NaN 索引。
在伪代码中
int j = 0;
for(int i= 0; i <= B.size(); ++i)
if(B[i] != NaN)
indices[j] = i
values[j] = B[i]
++j
sort(values[0 .. j-1])
for(int k = 0; k < j; ++k)
B[indices[k]]=values[k]