{}とdo...endの挙動が違うことがわからん(初歩的)

array = ["43", "38", "2", "99", "1389"]

p array.sort{|x, y| x.to_i <=> y.to_i} # No.1

p array.sort do |x, y| x.to_i <=> y.to_i end # No.2

の結果は

["2", "38", "43", "99", "1389"] # No.1 の結果

["1389", "2", "38", "43", "99"] # No.2 の結果

となる。
#1のばあいは、
1.まず array.sort{|x, y| x.to_i <=> y.to_i} を評価
2.p を 1の結果を引数として評価
という評価順序なんだろうけども、
#2のばあいは、
1.array.sort 評価(do 以下は評価してない)
2.p を 1の結果を引数として評価
しているようにみえる。
エラーは発生していないことから、シンタックスの間違いはないようで、
ためしに、

result = array.sort do |x, y| x.to_i <=> y.to_i end
p result

とすると

["2", "38", "43", "99", "1389"] # No.1 と同じ結果

となる。
#2では、do以下のコードブロックはpの引数になるんだろうけど、
pはコードブロックをどう扱っているんだろうか?というか、なんにもしてくれないのかな?