bubule.exs
defmodule BubbleSort do
def swap([a]), do: [a]
def swap([a, b]) when a >= b, do: [b, a]
def swap([a, b]), do: [a, b]
def fetch_two_from(list) when length(list) == 1, do: list
def fetch_two_from(list) do
[a | [b | _]] = list
[a, b]
end
def sort(list) do
#IO.inspect list
1..(length(list) - 1)
|> Enum.reduce(list, fn _, acc ->
_sort(acc, [])
end)
end
defp _sort(list, sorted) when length(list) == 0 do
#IO.inspect sorted
sorted
end
defp _sort(list, sorted) do
fetch_two_from(list) |> swap() |> _next_sort(list, sorted)
end
defp _next_sort(swapped, list, sorted) when length(swapped) <= 1 do
_sort([], sorted ++ swapped)
end
defp _next_sort(swapped, list, sorted) do
[a | [b | _]] = swapped
[_ | [_ | tail]] = list
_sort([b] ++ tail, sorted ++ [a])
end
end
記事を投稿しようとおもったきっかけなど
- 英語で学ぶコンピュータ・サイエンスVol.2 にボランティアスタッフとして参加するつもりでした
- 台風の接近のため会場での開催は無しとなって、シアトルからのオンライン配信となり、Zoomで英語授業のほうに参加していました
- 私は残念ながら英語をあまり聞き取れません
- ソートがテーマのようで、バブルソートを解説されていました
- 私がこれをはたしてプログラミングできるのだろうかとふと思いまして、おおよそ20年ぶりくらいにバブルソートをひょんなことから出会ったElixirで書いてみることにした次第です
- Elixirにはすでに便利なものが用意されていますのでそれを使えばよいとおもいます
-
Enum.reduceを使っているところはあれこれ悩んでこういう形になりましたがもっとよいやり方があるのではないかとおもっています
- 必ず(要素数 - 1)回処理することになっていますが、すでにソート済であればそこで打ち切るといった処理を書けていません
- 一応動きはしますが、あんまりいいコード例ではないとおもいます
-
[head | tail] = [1, 2, 3]
みたいな感じのところはうまくなった気がします - 私がこれを書いている間に子どもたちはバイナリサーチを学んでいました……
- 時代はかわりました
- 私が子供のころにはコンピューターと言えば、ファミリーコンピュータだけでした
- 買ってもらうために、あれこれ、親に説得を試みたことを覚えています
- これからは英語は当然できる、プログラミングも堪能な若い人がどんどん増えてくるとおもいますので日々精進して参りたいとおもう次第でございます