Merge pull request #514 from lq920320/Development
add MergeSortTest for MergeSort.
This commit is contained in:
commit
08dc6adfcc
75
src/main/java/com/sorts/MergeSort.java
Normal file
75
src/main/java/com/sorts/MergeSort.java
Normal file
@ -0,0 +1,75 @@
|
||||
package src.main.java.com.sorts;
|
||||
|
||||
public class MergeSort {
|
||||
|
||||
/**
|
||||
* This method implements the Generic Merge Sort
|
||||
*
|
||||
* @param unsorted the array which should be sorted
|
||||
* @param <T> Comparable class
|
||||
* @return sorted array
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends Comparable<T>> T[] sort(T[] unsorted) {
|
||||
T[] tmp = (T[]) new Comparable[unsorted.length];
|
||||
doSort(unsorted, tmp, 0, unsorted.length - 1);
|
||||
return unsorted;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param arr The array to be sorted
|
||||
* @param temp The copy of the actual array
|
||||
* @param left The first index of the array
|
||||
* @param right The last index of the array
|
||||
* Recursively sorts the array in increasing order
|
||||
**/
|
||||
private static <T extends Comparable<T>> void doSort(T[] arr, T[] temp, int left, int right) {
|
||||
if (left < right) {
|
||||
int mid = left + (right - left) / 2;
|
||||
doSort(arr, temp, left, mid);
|
||||
doSort(arr, temp, mid + 1, right);
|
||||
merge(arr, temp, left, mid, right);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method implements the merge step of the merge sort
|
||||
*
|
||||
* @param arr The array to be sorted
|
||||
* @param temp The copy of the actual array
|
||||
* @param left The first index of the array
|
||||
* @param mid The middle index of the array
|
||||
* @param right The last index of the array
|
||||
* merges two parts of an array in increasing order
|
||||
**/
|
||||
private static <T extends Comparable<T>> void merge(T[] arr, T[] temp, int left, int mid, int right) {
|
||||
System.arraycopy(arr, left, temp, left, right - left + 1);
|
||||
|
||||
int i = left;
|
||||
int j = mid + 1;
|
||||
int k = left;
|
||||
|
||||
while (i <= mid && j <= right) {
|
||||
if (temp[i].compareTo(temp[j]) <= 0) {
|
||||
arr[k] = temp[i];
|
||||
i++;
|
||||
} else {
|
||||
arr[k] = temp[j];
|
||||
j++;
|
||||
}
|
||||
k++;
|
||||
}
|
||||
|
||||
while (i <= mid) {
|
||||
arr[k] = temp[i];
|
||||
i++;
|
||||
k++;
|
||||
}
|
||||
|
||||
while (j <= right) {
|
||||
arr[k] = temp[j];
|
||||
j++;
|
||||
k++;
|
||||
}
|
||||
}
|
||||
}
|
34
src/test/java/com/sorts/MergeSortTest.java
Normal file
34
src/test/java/com/sorts/MergeSortTest.java
Normal file
@ -0,0 +1,34 @@
|
||||
package src.test.java.com.sorts;
|
||||
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import src.main.java.com.sorts.MergeSort;
|
||||
|
||||
public class MergeSortTest {
|
||||
|
||||
@Test
|
||||
public void mergeSortTest() {
|
||||
MergeSort mergeSort = new MergeSort();
|
||||
|
||||
Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7};
|
||||
Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
|
||||
Assert.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt));
|
||||
|
||||
unsortedInt = new Integer[]{5, 4, 3, 2, 1, 0};
|
||||
sortedInt = new Integer[]{0, 1, 2, 3, 4, 5};
|
||||
Assert.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt));
|
||||
|
||||
unsortedInt = new Integer[]{-1, -2, -3, -4, -5};
|
||||
sortedInt = new Integer[]{-5, -4, -3, -2, -1};
|
||||
Assert.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt));
|
||||
|
||||
unsortedInt = new Integer[]{-1, -5, -10, -990, 990, 1010};
|
||||
sortedInt = new Integer[]{-990, -10, -5, -1, 990, 1010};
|
||||
Assert.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt));
|
||||
|
||||
Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'};
|
||||
Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
|
||||
Assert.assertArrayEquals(sortedChar, mergeSort.sort(unsortedChar));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user