Wednesday, May 25, 2016

Top Down Merge Sort

Top down Merge Sort code in Java:
package com.kpatil.sort;

public class MergeSort {

 public static void sort(int[] list) {
  int[] aux = new int[list.length];
  sort(list, aux, 0, list.length - 1);
 }

 public static void sort(int[] list, int[] aux, int left, int right) {
  if (right <= left) {
   return;
  }

  int mid = left + (right - left) / 2;
  sort(list, aux, left, mid); // sort first half recursively
  sort(list, aux, mid + 1, right); // sort second half recursively
  merge(list, aux, left, mid, right); // merge two sorted halves
 }

 public static void merge(int[] list, int[] aux, int left, int mid, int right) {
  for (int k = left; k <= right; k++) {
   aux[k] = list[k];
  }
  int i = left;
  int j = mid + 1;
  for (int k = left; k <= right; k++) {
   if (i > mid) {
    list[k] = aux[j];
    j++;
   } else if (j > right) {
    list[k] = aux[i];
    i++;
   } else if (aux[j] < aux[i]) {
    list[k] = aux[j];
    j++;
   } else {
    list[k] = aux[i];
    i++;
   }
  }
 }

}
JUnit test cases:
package com.kpatil.test;

import static org.junit.Assert.assertEquals;

import java.util.Arrays;

import org.junit.Test;

import com.kpatil.sort.MergeSort;

public class MergeSortTest {
 @Test
 public void test1() {
  int[] array = { 5, 2, 89, 0, 10, 3, 20, 1 };
  int[] sorted = { 0, 1, 2, 3, 5, 10, 20, 89 };
  MergeSort.sort(array);
  assertEquals(true, Arrays.equals(array, sorted));
 }

 @Test
 public void test2() {
  int SIZE = 1000;
  int[] list = new int[SIZE];
  int[] expectedList = new int[SIZE];
  for (int i = 0; i < SIZE; i++) {
   int rand = (int) (Math.random() * SIZE);
   list[i] = rand;
   expectedList[i] = rand;
  }
  MergeSort.sort(list);
  System.out.println("------------------");
  Arrays.sort(expectedList);
  assertEquals(true, Arrays.equals(list, expectedList));

  for (int i = 0; i < SIZE; i++) {
   System.out.print(list[i] + " ");
  }
  System.out.println();
 }
}

No comments:

Post a Comment