LoginSignup
7
4

More than 3 years have passed since last update.

Elixirでバブルソートを書いてみる

Last updated at Posted at 2019-09-22
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)回処理することになっていますが、すでにソート済であればそこで打ち切るといった処理を書けていません
    • 一応動きはしますが、あんまりいいコード例ではないとおもいます :sob:
  • [head | tail] = [1, 2, 3] みたいな感じのところはうまくなった気がします
  • 私がこれを書いている間に子どもたちはバイナリサーチを学んでいました……
  • 時代はかわりました
    • 私が子供のころにはコンピューターと言えば、ファミリーコンピュータだけでした
    • 買ってもらうために、あれこれ、親に説得を試みたことを覚えています
  • これからは英語は当然できる、プログラミングも堪能な若い人がどんどん増えてくるとおもいますので日々精進して参りたいとおもう次第でございます
7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4