diff --git a/.github/workflows/zig.yml b/.github/workflows/zig.yml index 83b1d31..4b00efd 100644 --- a/.github/workflows/zig.yml +++ b/.github/workflows/zig.yml @@ -22,10 +22,6 @@ jobs: version: 0.11.0 cache: false - - - name: format kode zig - run: zig fmt . - - name: testing kode zig if: (startsWith(matrix.runs-on, 'ubuntu')) || (startsWith(matrix.runs-on, 'macos')) run: sh runtest.sh diff --git a/algorithm/sorting/mergeSort.zig b/algorithm/sorting/mergeSort.zig new file mode 100644 index 0000000..c59e5d9 --- /dev/null +++ b/algorithm/sorting/mergeSort.zig @@ -0,0 +1,70 @@ +const std = @import("std"); + +// Fungsi sorting untuk mengurutkan array dari variable A dengan merge sorting +pub fn mergeSort(array: []i32, b: []i32) void { + // cek panjang array a dan b sama + std.debug.assert(array.len == b.len); + // salin elemen-elemen dari array ke b + salinArray(array, 0, array.len, b); + // jalankan merge sort + bagiArray(b, 0, array.len, array); +} + +// fungsi untuk membagi dan menggabungkan array +fn bagiArray(b: []i32, start: usize, end: usize, array: []i32) void { + // jika panjang array kurang dari atau sama dengan 1, maka + // array sudah terurut + if (end - start <= 1) { + return; + } + // mencari titik tengah array + var mid = (end + start) / 2; + // panggil fungsi bagiArray secara rekursif dua bagian array + bagiArray(array, start, mid, b); + bagiArray(array, mid, end, b); + // gabung dua baguan array yang sudah terurut + gabungArray(b, start, mid, end, array); +} + +// fungsi menggabungkan dua bagian array yang terurut +fn gabungArray(array: []i32, start: usize, mid: usize, end: usize, b: []i32) void { + var i = start; + var k = start; + var j = mid; + // gabunggang dua bagian array + while (k < end) : (k += 1) { + if (i < mid and (j >= end or array[i] <= array[j])) { + b[k] = array[i]; + i = i + 1; + } else { + b[k] = array[j]; + j = j + 1; + } + } +} + +// fungsi salin_array untuk menyalin elemen array dari satu array ke array lainnya +fn salinArray(array: []i32, start: usize, end: usize, b: []i32) void { + var k = start; + while (k < end) : (k += 1) { + b[k] = array[k]; + } +} + +// buat testing untuk memastikan fungsi mergeSort berjalan +test "testing mergeSorting" { + // test array kosong + var array: []i32 = &.{}; + var w_array: []i32 = &.{}; + mergeSort(array, w_array); + const a = array.len; + try std.testing.expect(a == 0); + + // testing dengan array terbalik + var array_terbalik: [10]i32 = .{ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; + var w_array_terbalik: [10]i32 = .{0} ** 10; + mergeSort(&array_terbalik, &w_array_terbalik); + for (array_terbalik, 0..) |value, i| { + try std.testing.expect(value == (i + 1)); + } +} diff --git a/build.zig b/build.zig index 4f685ca..e30f840 100644 --- a/build.zig +++ b/build.zig @@ -28,6 +28,8 @@ pub fn build(b: *std.Build) void { .category = "math", }); + // math/ceil + // ceil if (std.mem.eql(u8, op, "math/ceil")) buat_algo(b, .{ .optimize = optimize, @@ -45,6 +47,16 @@ pub fn build(b: *std.Build) void { .name = "bubbleSort.zig", .category = "algorithm/sorting", }); + + // algoritma/sorting + // merge sorting + if (std.mem.eql(u8, op, "algorithm/sorting/mergeSort")) + buat_algo(b, .{ + .optimize = optimize, + .target = target, + .name = "mergeSort.zig", + .category = "algorithm/sorting", + }); } // fungsi untuk membangun algoritma berdasarkan informasi yang diberikan diff --git a/runtest.sh b/runtest.sh index a11da1a..c3fa07a 100644 --- a/runtest.sh +++ b/runtest.sh @@ -21,3 +21,4 @@ $ZIG_TEST_COMMAND -Dalgoritma=math/gcd $argumen $ZIG_TEST_COMMAND -Dalgoritma=math/faktorial $argumen $ZIG_TEST_COMMAND -Dalgoritma=math/ceil $argumen $ZIG_TEST_COMMAND -Dalgoritma=algorithm/sorting/bubbleSort $argumen +$ZIG_TEST_COMMAND -Dalgoritma=algorithm/sorting/mergeSort $argumen