Skip to content

Instantly share code, notes, and snippets.

@pedrofurtado
Created January 3, 2016 16:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pedrofurtado/05ecd2ebf57c57ba5aa9 to your computer and use it in GitHub Desktop.
Save pedrofurtado/05ecd2ebf57c57ba5aa9 to your computer and use it in GitHub Desktop.
Implementation of Merge Sort in Java.
/**
* @file
* Merge sort class.
*/
public class MergeSort {
/**
* Printing vector method.
*
* Prints on screen the elements of the vector, from first to last element.
*
* @param int[] a
* Vector of integers.
* @return void
*/
public static void print_vector(int[] a) {
if (a == null) {
System.out.println("Null vector.");
return;
}
System.out.println();
System.out.print("< ");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + ", ");
}
System.out.print(" >");
System.out.println();
}
/**
* Merge sort.
*
* Recursive version.
*
* Sort order: Ascending.
*
* @param int[] a
* Vector of integers.
* @param int begin
* Initial index of vector.
* @param int end
* Last index of vector.
* @return void
*/
public static void merge_sort_ascending(int[] a, int begin, int end) {
if (a == null) return;
if (end <= begin) return;
int middle = (begin + end) / 2;
merge_sort_ascending(a, begin, middle);
merge_sort_ascending(a, middle + 1, end);
int[] A = new int[middle - begin + 1];
int[] B = new int[end - middle];
for (int i = 0; i <= middle - begin; i++) {
A[i] = a[begin + i];
}
for (int i = 0; i <= end - middle - 1; i++) {
B[i] = a[middle + 1 + i];
}
int i = 0;
int j = 0;
for (int k = begin; k <= end; k++) {
if (i < A.length && j < B.length) {
if (A[i] < B[j]) {
a[k] = A[i++];
}
else {
a[k] = B[j++];
}
}
else if (i < A.length) {
a[k] = A[i++];
}
else if (j < B.length) {
a[k] = B[j++];
}
}
}
/**
* Overloading of merge_sort_ascending() method.
*
* Simplifies the call of method.
*/
public static void merge_sort_ascending(int[] a) {
merge_sort_ascending(a, 0, a.length - 1);
}
/**
* Merge sort.
*
* Recursive version.
*
* Sort order: Descending.
*
* @param int[] a
* Vector of integers.
* @param int begin
* Initial index of vector.
* @param int end
* Last index of vector.
* @return void
*/
public static void merge_sort_descending(int[] a, int begin, int end) {
if (a == null) return;
if (end <= begin) return;
int middle = (begin + end) / 2;
merge_sort_descending(a, begin, middle);
merge_sort_descending(a, middle + 1, end);
int[] A = new int[middle - begin + 1];
int[] B = new int[end - middle];
for (int i = 0; i <= middle - begin; i++) {
A[i] = a[begin + i];
}
for (int i = 0; i <= end - middle - 1; i++) {
B[i] = a[middle + 1 + i];
}
int i = 0;
int j = 0;
for (int k = begin; k <= end; k++) {
if (i < A.length && j < B.length) {
if (A[i] > B[j]) {
a[k] = A[i++];
}
else {
a[k] = B[j++];
}
}
else if (i < A.length) {
a[k] = A[i++];
}
else if (j < B.length) {
a[k] = B[j++];
}
}
}
/**
* Overloading of merge_sort_descending() method.
*
* Simplifies the call of method.
*/
public static void merge_sort_descending(int[] a) {
merge_sort_descending(a, 0, a.length - 1);
}
/**
* Examples of use.
*/
public static void main(String args[]) {
int[] a = { 24, 4, 67, 4, 3, 5, 6, 6, 7, 34, 12, 12, 24, 35, 2, 24, 45, 56, 78 };
merge_sort_descending(a);
System.out.println("Initial vector:");
print_vector(a);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment