From 9654341389bedae9e7c64ae6a3035369d93e3fdf Mon Sep 17 00:00:00 2001 From: Dimitrios Saviolakis Date: Thu, 6 Mar 2025 20:27:56 +0200 Subject: [PATCH] [Dana] Add mergesort --- dana/programs/mergesort.dana | 83 ++++++++++++++++++++++++++++++++++ dana/programs/mergesort.input | 2 + dana/programs/mergesort.result | 1 + 3 files changed, 86 insertions(+) create mode 100644 dana/programs/mergesort.dana create mode 100644 dana/programs/mergesort.input create mode 100644 dana/programs/mergesort.result diff --git a/dana/programs/mergesort.dana b/dana/programs/mergesort.dana new file mode 100644 index 0000000..7c924f0 --- /dev/null +++ b/dana/programs/mergesort.dana @@ -0,0 +1,83 @@ +def merge: arr as int [], left as int, mid as int, right as int + var n1 n2 i j k is int + n1 := mid - left + 1 + n2 := right - mid + + var L is int [n1] + var R is int [n2] + + i := 0 + loop: + if i < n1: + L[i] := arr[left + i] + i := i + 1 + else: break + + j := 0 + loop: + if j < n2: + R[j] := arr[mid + 1 + j] + j := j + 1 + else: break + + i := 0 + j := 0 + k := left + + loop: + if i < n1 and j < n2: + if L[i] <= R[j]: + arr[k] := L[i] + i := i + 1 + else: + arr[k] := R[j] + j := j + 1 + k := k + 1 + else: break + + loop: + if i < n1: + arr[k] := L[i] + i := i + 1 + k := k + 1 + else: break + + loop: + if j < n2: + arr[k] := R[j] + j := j + 1 + k := k + 1 + else: break + +def merge_sort: arr as int [], left as int, right as int + if left < right: + var mid is int + mid := (left + right) / 2 + merge_sort: arr, left, mid + merge_sort: arr, mid + 1, right + merge: arr, left, mid, right + +def main + var n is int + n := readInteger() + + var arr is int [n] + var i is int + + i := 0 + loop: + if i < n: + arr[i] := readInteger() + i := i + 1 + else: break + + merge_sort: arr, 0, n-1 + + i := 0 + loop: + if i < n: + writeInteger: arr[i] + writeString: " " + i := i + 1 + else: break + writeString: "\n" diff --git a/dana/programs/mergesort.input b/dana/programs/mergesort.input new file mode 100644 index 0000000..3cc71eb --- /dev/null +++ b/dana/programs/mergesort.input @@ -0,0 +1,2 @@ +5 +12 3 7 1 9 diff --git a/dana/programs/mergesort.result b/dana/programs/mergesort.result new file mode 100644 index 0000000..fb08643 --- /dev/null +++ b/dana/programs/mergesort.result @@ -0,0 +1 @@ +1 3 7 9 12