2013-11-14 64 views
0

我想編寫一個程序,將數組拆分成兩個數組,其中一個數組中的任何元素都小於另一個數組中的任何元素。如何使用while循環拆分數組?

,我有輸入是:

a = [6, 45, 23, 65, 17, 48, 97, 32, 18, 9, 88] 

而且想我這樣的輸出:

[6, 23, 17, 18 , 9] < [45, 65, 48, 97, 32, 88] 

我已經試過:

i = 0 
max = 0 

while i < a.size 
    if a[i] > max 
    max = a[i] 
    end 
    i+=1 
end 

puts "this is the larger array: " + max.to_s 

這是完全關閉。由於我對此感到陌生,因此對此表示讚賞。

+1

什麼是其中兩個陣列應分拆標準是什麼?他們是否應該具有相同的長度或其他標準? – hirolau

+0

感謝hirolau,我應該提到這一點。是大約相同的尺寸 –

回答

4
small, large = a.sort!.shift(a.size/2) ,a 

p small, large 
#=> [6, 9, 17, 18, 23] 
#=> [32, 45, 48, 65, 88, 97] 
+0

謝謝hirolau,那是紅寶石? –

+0

這裏沒有Rails語法,1.8和1.9之間在並行分配的工作方式上有一些變化,但我認爲它應該在1.8+以上。 – hirolau

+0

謝謝hirolau,那很完美! –

0

不要使用while循環 - 數組排序,然後將其分成兩

a.sort 
a.in_groups_of(a.size/2) 


a.sort.each_slice(a.size/2) probably does the trick without rails. 
+0

基於什麼? –

+0

我不是一個紅寶石程序員,但這個例子大致顯示了 – vogomatix

+1

這個工作,但只有當你使用rails時,ruby沒有in_groups_of – sabrams

0

假設你想維持秩序,如在你的榜樣:

def split_it(a,n) 
    f = a.select {|e| e <= n} 
    [f, a-f] 
end 

a = [6, 45, 23, 65, 17, 48, 97, 32, 18, 9, 88] 

f, l = split_it(a,23) 
puts "#{f} < #{l}" # => [6, 23, 17, 18, 9] < [45, 65, 48, 97, 32, 88] 

如果你想爲了維持秩序並且讓第一個子陣列包含nbr元素,請加上:

def split_nbr(a, nbr) 
    n = 1 
    loop do 
    return [] if n > a.max 
    b = split_it(a,n) 
    return b if b.first.size == nbr 
    n += 1 
    end 
end 

f, l = split_nbr(a,3) 
puts "#{f} < #{l}" # => [6, 17, 9] < [45, 23, 65, 48, 97, 32, 18, 88] 
2

試試這個:

newarray = a.sort.each_slice((a.size/2.0).round).to_a 

它會給你包含您的拆分數組的數組:

newarray = [[6,9,17,18,23,32],[45,48,65,88,97]] 

在這種情況下,如果你有一個奇數的數組中的元素,第一個返回數組的意志總是有額外的元素。如果你願意的話,你也可以單獨保存數組,但是這樣你可以用newarray [0]和newarray [1]來調用每一半。如果要分割他們只需添加:

b = newarray[0] 
c = newarray[1] 
+0

我不知道我是如何忽略這一點的,謝謝sabrams這真棒! –

+1

無需循環。只需除以2而不是2.0。 – hirolau

0
a = [6, 45, 23, 65, 17, 48, 97, 32, 18, 9, 88] 
a = a.sort 
print a.shift(a.count/2), " < " , a 
#=> [6, 9, 17, 18, 23] < [32, 45, 48, 65, 88, 97] 

另一個變化

a = [6, 45, 23, 65, 17, 48, 97, 32, 18, 9, 88] 
a = a.sort 
print a.values_at(0..a.count/2), " < ", a.values_at((a.count/2)+1 .. -1) 
#=> [6, 9, 17, 18, 23] < [32, 45, 48, 65, 88, 97]