nurzain-pradana

TugasMergeSort.java

Nov 10th, 2025 (edited)
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.52 KB | None | 0 0
  1. package id.ac.ut.praktikumstrukturdata.modul6;
  2.  
  3. import java.util.Arrays;
  4.  
  5. /**
  6.  *
  7.  * @author Nur Zain Pradana 053126827 Semester 2 Prodi Sistem Informasi UT
  8.  * Jakarta
  9.  *
  10.  */
  11. public class TugasMergeSort {
  12.  
  13.     public static void main(String args[]) {
  14.         /**
  15.          * Membuat Variable *
  16.          */
  17.         int a1 = 25;
  18.         int a2 = 7;
  19.         int a3 = 18;
  20.         int a4 = 42;
  21.         int a5 = 13;
  22.         int a6 = 9;
  23.         int a7 = 31;
  24.         int a8 = 2;
  25.  
  26.         int arr[] = {a1, a2, a3, a4, a5, a6, a7, a8};
  27.  
  28.         System.out.println("Array awal : ");
  29.         printArray(arr);
  30.  
  31.         /**
  32.          * Proses Merge Sort *
  33.          */
  34.         TugasMergeSort ob = new TugasMergeSort();
  35.         ob.sort(arr, 0, arr.length - 1);
  36.  
  37.         System.out.println();
  38.         System.out.println("Hasil Array menggunakan Merge Sort secara Descending : ");
  39.         printArray(arr);
  40.        
  41.        
  42.         /** ANALISA ALGORITMA MERGE SORT **/
  43.         String kesimpulan = """
  44.            ===================================
  45.             KESIMPULAN ALGORITMA MERGE SORT (DESCENDING)
  46.            ===================================
  47.            Merge Sort adalah algoritma pengurutan dengan konsep 'divide and conquer':
  48.            - Membagi array menjadi dua bagian secara rekursif (divide)
  49.            - Mengurutkan tiap bagian secara terpisah
  50.            - Menggabungkan kembali dua bagian terurut (merge)
  51.  
  52.            Pada versi descending, elemen yang lebih besar akan ditempatkan terlebih dahulu
  53.            dengan membandingkan L[i] >= R[j].
  54.  
  55.            Kelebihan:
  56.            - Stabil dan efisien untuk data besar
  57.            - Waktu eksekusi konsisten di semua kasus
  58.  
  59.            Kekurangan:
  60.            - Membutuhkan memori tambahan (array sementara)
  61.            - Kurang efisien untuk data kecil
  62.  
  63.            Contoh hasil:
  64.            Array awal  : [25, 7, 18, 42, 13, 9, 31, 2]
  65.            Hasil akhir : [42, 31, 25, 18, 13, 9, 7, 2]
  66.            ===================================
  67.            """;
  68.  
  69.         System.out.println(kesimpulan);
  70.     }
  71.  
  72.     /**
  73.      * Fungsi untuk membagi array menjadi 2 bagian secara rekursif, kemudian
  74.      * mengurutkannya. *
  75.      */
  76.     void sort(int arr[], int l, int r) {
  77.  
  78.         System.out.println();
  79.         System.out.println("Memanggil sort(arr, " + l + ", " + r + "): bagian saat ini " + Arrays.toString(Arrays.copyOfRange(arr, l, r + 1)));
  80.  
  81.         if (l < r) {
  82.             int m = (l + r) / 2;
  83.             System.out.println("  Membagi menjadi dua bagian: [" + l + ".." + m + "] dan [" + (m + 1) + ".." + r + "]");
  84.  
  85.             /**
  86.              * Urutkan Bagian Kiri *
  87.              */
  88.             sort(arr, l, m);
  89.  
  90.             /**
  91.              * Urutkan Bagian Kanan *
  92.              */
  93.             sort(arr, m + 1, r);
  94.  
  95.             /**
  96.              * Gabungkan 2 bagian yang sudah terurut secara Descending*
  97.              */
  98.             merge(arr, l, m, r);
  99.         } else {
  100.             /**
  101.              * Tidak perlu diurutkan *
  102.              */
  103.             System.out.println("  Bagian [" + l + ".." + r + "] hanya satu elemen, tidak perlu diurutkan");
  104.         }
  105.     }
  106.  
  107.     /**
  108.      * Function untuk menggabungkan 2 bagian array yang sudah terurut *
  109.      */
  110.     void merge(int[] arr, int l, int m, int r) {
  111.         int n1 = m - l + 1;
  112.         int n2 = r - m;
  113.  
  114.         int L[] = new int[n1];
  115.         int R[] = new int[n2];
  116.  
  117.         // Menyalin elemen ke array sementara L & R
  118.         for (int i = 0; i < n1; i++) {
  119.             L[i] = arr[l + i];
  120.         }
  121.  
  122.         for (int j = 0; j < n2; j++) {
  123.             R[j] = arr[m + 1 + j];
  124.         }
  125.  
  126.         System.out.println();
  127.         System.out.println("Memulai proses Merge untuk indeks [" + l + ".." + m + "] dan [" + (m + 1) + ".." + r + "]");
  128.         System.out.println("  Bagian Kiri (L): " + Arrays.toString(L));
  129.         System.out.println("  Bagian Kanan (R): " + Arrays.toString(R));
  130.  
  131.         int i = 0, j = 0;
  132.         int k = l;
  133.  
  134.         // Membandingkan elemen dari L dan R lalu dimasukkan kedalam array utama arr.
  135.         while (i < n1 && j < n2) {
  136.             System.out.println("  Bandingkan L[" + i + "]=" + L[i] + " dengan R[" + j + "]=" + R[j]);
  137.  
  138.             if (L[i] >= R[j]) { // besar dulu -> descending
  139.                 arr[k] = L[i];
  140.                 System.out.println("    Ambil L[" + i + "]=" + L[i] + " ke arr[" + k + "]");
  141.                 i++;
  142.             } else {
  143.                 arr[k] = R[j];
  144.                 System.out.println("    Ambil R[" + j + "]=" + R[j] + " ke arr[" + k + "]");
  145.                 j++;
  146.             }
  147.             k++;
  148.             System.out.println("    Hasil sementara: " + Arrays.toString(arr));
  149.  
  150.         }
  151.  
  152.         /**
  153.          * Jika masih ada sisa elemen di L, masukkan ke array utama arr *
  154.          */
  155.         while (i < n1) {
  156.             arr[k] = L[i];
  157.             i++;
  158.             k++;
  159.         }
  160.  
  161.         /**
  162.          * Jika masih ada sisa elemen di R, masukkan ke array utama arr *
  163.          */
  164.         while (j < n2) {
  165.             arr[k] = R[j];
  166.             j++;
  167.             k++;
  168.         }
  169.  
  170.         System.out.println("  Selesai merge untuk indeks [" + l + ".." + r + "]: "
  171.                 + Arrays.toString(Arrays.copyOfRange(arr, l, r + 1)));
  172.     }
  173.  
  174.     /**
  175.      * Function untuk mencetak isi Array *
  176.      */
  177.     static void printArray(int arr[]) {
  178.         int n = arr.length;
  179.         for (int i = 0; i < n; i++) {
  180.             System.out.print(arr[i] + " ");
  181.         }
  182.         System.out.println();
  183.     }
  184. }
  185.  
Advertisement
Add Comment
Please, Sign In to add comment