Skip to content

Instantly share code, notes, and snippets.

@koyo-miyamura
Created October 20, 2020 16:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koyo-miyamura/78e7002a55f872bf6e5a37ffbd1e46ea to your computer and use it in GitHub Desktop.
Save koyo-miyamura/78e7002a55f872bf6e5a37ffbd1e46ea to your computer and use it in GitHub Desktop.
defmodule MergeSort do
def sort(list) do
do_sort(list, 0, length(list))
end
defp do_sort(list, left, right) when right - left == 1 do
Enum.slice(list, left..(right - 1))
end
defp do_sort(list, left, right) do
mid = floor((left + right) / 2)
(do_sort(list, left, mid) ++ (do_sort(list, mid, right) |> Enum.reverse()))
|> merge([])
end
defp merge([], acc), do: acc
defp merge([num], acc), do: acc ++ [num]
defp merge(list, acc) do
{left, left_rest} = List.pop_at(list, 0)
{right, right_rest} = List.pop_at(list, -1)
if left <= right do
merge(left_rest, acc ++ [left])
else
merge(right_rest, acc ++ [right])
end
end
end
MergeSort.sort([1, 3, 2, 5, 4, 11, 3, 21, 34, 2]) |> IO.inspect()
package main
import "fmt"
func main() {
a := []int{1, 3, 2, 5, 4, 11, 3, 21, 34, 2}
mergeSort(a)
fmt.Println(a)
}
func mergeSort(a []int) {
_mergeSort(a, 0, len(a))
}
func _mergeSort(a []int, left, right int) {
if (right - left) == 1 {
return
}
mid := (left + right) / 2
_mergeSort(a, left, mid)
_mergeSort(a, mid, right)
buf := []int{}
for i := left; i < mid; i++ {
buf = append(buf, a[i])
}
for i := right - 1; i >= mid; i-- {
buf = append(buf, a[i])
}
var (
li = 0
ri = len(buf) - 1
)
for i := left; i < right; i++ {
if buf[li] <= buf[ri] {
a[i] = buf[li]
li++
} else {
a[i] = buf[ri]
ri--
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment