Ruby 在没有附加数组的情况下对数组的子序列进行排序

Ruby 在没有附加数组的情况下对数组的子序列进行排序,ruby,algorithm,sorting,Ruby,Algorithm,Sorting,我是编程新手。我刚开始学习Ruby,不知道如何在不使用额外数组的情况下实现数组负(或正)元素的置换算法。 例如: 像这样:[-10,3,-1,0,-9]->[-10,3,-9,0,-1](只对负片排序) 或者:[-5,5,8,2,1]->[-5,1,1,8,2,5](只对正数排序) sort_negatives是对sort_negativesdef swap(arr,i,j)的直接修改 arr[i]=arr[i]^arr[j] arr[j]=arr[j]^arr[i] arr[i]=arr[j]

我是编程新手。我刚开始学习Ruby,不知道如何在不使用额外数组的情况下实现数组负(或正)元素的置换算法。
例如:
像这样:[-10,3,-1,0,-9]->[-10,3,-9,0,-1](只对负片排序)
或者:[-5,5,8,2,1]->[-5,1,1,8,2,5](只对正数排序)

sort_negatives
是对
sort_negatives

def swap(arr,i,j)的直接修改
arr[i]=arr[i]^arr[j]
arr[j]=arr[j]^arr[i]
arr[i]=arr[j]^arr[i]
结束
def分拣_负片(arr)
尺寸=arr.size
i=0
而我0#第一个负数索引
next_neg=0
最小负=i
(i+1)。最大(尺寸-1)do|j|
如果arr[i]<0&&arr[j]<0
如果next_neg==0,则next_neg=j
如果arr[minu neg]>arr[j],则minu neg=j
结束
结束
如果最小负>i,则交换(arr,i,最小负)
如果next_neg>0
i=next_neg#跳到下一个负数
其他的
打破
结束
结束
结束
arr=[-10,0,2,6,10,-1,7,20,1,0,-9,13,6,88,-11,-156]
排序为负(arr)
放置arr.inspect[156,0,2,6,10,11,7,20,1,0,10,13,6,88,9,1]

您知道如何在没有额外数组的情况下编写常规排序函数(例如,快速排序可以满足此要求)?您可以修改该代码以忽略某些元素吗?您可以交换数组中的元素。例如,
arr[0],arr[1]=arr[1],arr[0]
。希望这能帮助你获得成功started@maxpleaner:这将创建一个两元素数组,至少在语义上是这样。我相信JRuby和TruffleRuby可以对它进行优化,但根据语言语义,它总是存在的。@KirKon753:在没有额外数组的情况下进行编码是一项挑战,还是您担心性能?从易读性的角度来看,最干净的解决方案将使用辅助数组。
arr[i],arr[min_neg]=arr[min_neg],arr[i]
将创建一个数组,根据OP.@JörgWMittag i替换为XOR运算符,这是不允许的。
def sort_positives(arr)
  (arr.size-1).times do |i|
    next if arr[i] <= 0
    smallest = i
    (i+1..arr.size-1).each do |j|
      smallest = j if arr[j] > 0 && arr[j] < arr[smallest]
    end
    if smallest > i
      tmp = arr[i]
      arr[i] = arr[smallest]
      arr[smallest] = tmp
    end
  end
  arr
end
arr = [-2, 5, 3, -4, 6, 1, -3]
sort_positives arr
  #=> [-2, 1, 3, -4, 5, 6, -3]
arr
  #=> [-2, 1, 3, -4, 5, 6, -3]