[アルゴリズム] マージソートのプログラミング(Ruby編)

2017年3月27日

Python テクノロジー プログラミング 特集

Ruby言語とPython言語は、コーディングした見た目が誰が書いても分かりやすいと聞くが、いままでそれは、言語的に遊びがないからだと思っていた。 確かにインデントなどの扱いでエラーになる言語なので、単純にインデントだけの話だと思っていたが、今回のプログラムを書いて気がついたのだが、ものの10分程度で完了できた。 基本的にはPHPプログラムのローカライズをしただけなのだが、関数や変数、その他の処理など、そのまま移していくことでほとんどエラーも出ずに完了できた。 そして、コーディングもほぼブレがなく、誰が書いても大体同じという事なのだろう。 C言語やshellなどと違いこんなに早く終わったので、拍子抜けではあるが、とりあえず今回はこんな感じ。

ソースコード

def midPoint(nums) return ((nums.count / 2) + 0.5).floor end def setMerge(arr1 , arr2) arr = [] while arr1.count > 0 || arr2.count > 0 do if arr1.count == 0 then arr.push(arr2.shift) elsif arr2.count == 0 then arr.push(arr1.shift) elsif arr1[0] > arr2[0] then arr.push(arr2.shift) else arr.push(arr1.shift) end end return arr end def mergeSort(numbers) if numbers.count == 0 then numbers = [] elsif numbers.count == 1 then numbers = numbers elsif numbers.count == 2 then if numbers[0] > numbers[1] then tmp = numbers[0] numbers[0] = numbers[1] numbers[1] = tmp end else midNum = midPoint(numbers) arr1 = numbers.slice(0,midNum+1) arr2 = numbers.slice(midNum+1,numbers.count) arr1 = mergeSort(arr1) arr2 = mergeSort(arr2) numbers = setMerge(arr1 , arr2) end return numbers end numbers = [10,2,12,7,16,8,13] print mergeSort(numbers) ,"\n"

実行

$ ruby mergeSort.rb [2, 7, 8, 10, 12, 13, 16]

解説

rubyの小数点切り捨て、四捨五入

return ((nums.count / 2) + 0.5).floor 切り捨ては@.floorで行える。 四捨五入は、0.5を足した後、@.floorすればいい

配列の要素数(length)

arr.count ruby言語は、javascriptのprototypeのような扱いで行えるのが非常に分かりやすい。

配列の追加(push)

arr.pusn(変数 or 配列)

配列の先頭を抜き出す(破壊的処理:shift)

hoge = arr.shift hogeに先頭の値が入り、arrは先頭を抜かした残りの配列になる(要素数が一つ減る)

配列の特定部分の抜き出し(slice)

arr.slice(start-num , count-num) startは配列の要素番号(0スタート)で、countは○文字分になる。 今回のプログラム内では、中間値が要素数で取得しているので、+1をすることで、対応している。

関連記事

たくさんのプログラム言語でアルゴリズム学習

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。