diff --git a/pcl/programs/mergesort.input b/pcl/programs/mergesort.input new file mode 120000 index 0000000..e4b7eff --- /dev/null +++ b/pcl/programs/mergesort.input @@ -0,0 +1 @@ +../../dana/programs/mergesort.input \ No newline at end of file diff --git a/pcl/programs/mergesort.pcl b/pcl/programs/mergesort.pcl new file mode 100644 index 0000000..fa6b503 --- /dev/null +++ b/pcl/programs/mergesort.pcl @@ -0,0 +1,115 @@ +program mergesort; + +var maxSize, n, i : integer; +var arr : ^array of integer; + + +procedure Mergesort (var arr : array of integer); + + procedure merge (left, mid, right : integer); + var i, j, sz : integer; + var helper : ^array of integer; + begin + new [right - left + 1] helper; + + i := left; (* left half *) + j := mid + 1; (* right half *) + sz := 0; (* helper size *) + + while (i <= mid) and (j <= right) do (* both halves have elements *) + begin + if arr[i] <= arr[j] then + begin + helper^[sz] := arr[i]; + i := i + 1 + end + else + begin + helper^[sz] := arr[j]; + j := j + 1 + end; + sz := sz + 1 + end; + + while i <= mid do (* left half *) + begin + helper^[sz] := arr[i]; + i := i + 1; + sz := sz + 1 + end; + + while j <= right do (* right half *) + begin + helper^[sz] := arr[j]; + j := j + 1; + sz := sz + 1 + end; + + (* copy back *) + i := 0; + while i < sz do + begin + arr[left + i] := helper^[i]; + i := i + 1 + end; + + (* free *) + dispose [] helper + end; + + procedure Mergesort0 (left, right : integer); + var mid : integer; + begin + if left < right then + begin + mid := (left + right) div 2; + Mergesort0(left, mid); + Mergesort0(mid + 1, right); + merge(left, mid, right) + end + end; + +begin + Mergesort0(0, n - 1) +end; + +begin + + maxSize := 1000; + + n := readInteger(); + + if n > maxSize then (* cap at maxSize *) + begin + writeString("Warning: Input size exceeds program capacity ("); + writeInteger(maxSize); + writeString(" elements). Processing first "); + writeInteger(maxSize); + writeString(".\n"); + n := maxSize + end; + + new [n] arr; + + i := 0; + while i < n do + begin + arr^[i] := readInteger(); + i := i + 1 + end; + + (* dereference, since it's passed as reference *) + Mergesort(arr^); + + i := 0; + while i < n do + begin + writeInteger(arr^[i]); + writeString(" "); + i := i + 1 + end; + writeString("\n"); + + (* free *) + dispose [] arr +end. \ No newline at end of file diff --git a/pcl/programs/mergesort.result b/pcl/programs/mergesort.result new file mode 120000 index 0000000..b882011 --- /dev/null +++ b/pcl/programs/mergesort.result @@ -0,0 +1 @@ +../../dana/programs/mergesort.result \ No newline at end of file