Advertisement
Guest User

Merging k sorted lists (Merge 2 at a time)

a guest
Sep 24th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.81 KB | None | 0 0
  1.  
  2. import java.io.*;
  3. import java.util.*;
  4.  
  5. public class Main {
  6.  
  7.     static int n, k;
  8.     static int[] arr, aux;
  9.  
  10.     // from arr[lo] to arr[mid] is sorted
  11.     // from arr[mid+1] to arr[hi] is sorted
  12.     // at the end of the procedure: from arr[lo] to arr[hi] is sorted
  13.     static void merge(int lo, int mid, int hi) {     // O(n) where n = hi-lo+1
  14.         for (int k = lo; k <= hi; k++) {
  15.             aux[k] = arr[k];
  16.         }
  17.  
  18.         int i = lo, j = mid + 1;
  19.         for (int k = lo; k <= hi; k++) {
  20.             if (i > mid)
  21.                 arr[k] = aux[j++];
  22.             else if (j > hi)
  23.                 arr[k] = aux[i++];
  24.             else if (aux[j] < aux[i])
  25.                 arr[k] = aux[j++];
  26.             else
  27.                 arr[k] = aux[i++];
  28.         }
  29.     }
  30.  
  31.     public static void main(String args[]) {
  32.  
  33.         Scanner read = new Scanner(System.in);
  34.         n = read.nextInt();     // total number of elements
  35.         k = read.nextInt();     // number of lists
  36.         arr = new int[n];
  37.         aux = new int[n];
  38.         for (int i = 0; i < n; i++) {
  39.             arr[i] = read.nextInt();
  40.         }
  41.  
  42.         // Step 1: Merge arrays (1 and 2), arrays (3 and 4), and so on.
  43.         // Step 2: Merge array (1,2 and 3,4), arrays (5,6 and 7,8), and so on
  44.         // Step 3: Repeat...
  45.         // sz is number of elements per list = n/k
  46.         // important note: each step, sz will be doubled, sz = sz*2
  47.         // assume n = 8, k = 4
  48.         //          0  1   2  3   4  5   6  7
  49.         // arr[] = {3, 4,  1, 2,  7, 8,  5, 6}
  50.         //         <(1)>   <(2)>  <(3)>  <(4)>
  51.         // Step 1: Merge arrays (1 and 2)
  52.         //              merge(lo = 0, hi = 3, mid = 1)
  53.         //         Merge arrays (3 and 4)
  54.         //              merge(lo = 4, hi = 7, mid = 5)
  55.         // Step 2: Merge array (1,2 and 3,4)
  56.         //              merge(lo = 0, hi = 7, mid = 3)
  57.         // we can  think of the parameters as the following with the help of sz important note
  58.         // Step 1 (sz= n/k = 8/4 = 2):
  59.         //         Merge arrays (1 and 2)
  60.         //              merge(lo = 0, hi = lo + (2*sz) - 1 = 3, mid = lo+sz-1 = 1)
  61.         //         Merge arrays (3 and 4)
  62.         //              merge(lo = 4, hi = lo + (2*sz) - 1 = 7, mid = lo+sz-1 = 5)
  63.         // Step 2 (sz = sz*2 = 4): : Merge array (1,2 and 3,4)
  64.         //              merge(lo = 0, hi = lo + (2*sz) - 1 = 7, mid = lo+sz-1 = 3)
  65.         // the remaining is: lo = ?
  66.         for (int sz = n / k; sz < n; sz = sz * 2) {
  67.             for (int lo = 0; lo < n - sz; lo += sz * 2) {
  68.                 int hi = lo + (2 * sz) - 1;
  69.                 int mid = lo + sz - 1;
  70.                 merge(lo, mid, hi);
  71.             }
  72.         }
  73.  
  74.  
  75.         for (int i = 0; i < n; i++) {
  76.             System.out.print(arr[i] + " ");
  77.         }
  78.  
  79.     }
  80.  
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement