T
transdenzentral
Gast
Hallo Leute,
ich bin grad dabei ein generisches MergeSort mit Arrays zu schreiben. Folgenden Code habe ich mir bisher zusammengebaut.
Mir ist schon klar, dass man eigentlich solche Sortieralgorithmen nicht selber schreibt, aber in Vorbereitung auf eine anstehende Klausur ist das unumgänglich.
Als Test habe ich folgende JUnit Klasse gebaut:
Ich hab mich jetzt eine Zeit lang mit dem Debugger in Eclipse abgemüht und herausgefunden, dass mein Algorithmus prinzipiell funktioniert und mir das übergebene Array richtig sortiert. Aber im TestCase kracht es dann bei jedem Durchlauf. Casten funktioniert nicht. Wie kann ich das besser machen bzw. hinbiegen, dass der Test auch tatsächlich positiv durchläuft (es IST ja sortiert).
Viele Grüße & Vielen Dank,
Hoffe Ihr könnt mir helfen
transdenzentral
ich bin grad dabei ein generisches MergeSort mit Arrays zu schreiben. Folgenden Code habe ich mir bisher zusammengebaut.
Mir ist schon klar, dass man eigentlich solche Sortieralgorithmen nicht selber schreibt, aber in Vorbereitung auf eine anstehende Klausur ist das unumgänglich.
Java:
package sort;
import java.util.Arrays;
public class Sort {
/**
*
* @param array
* @see [url=http://www.youtube.com/watch?v=XaqR3G_NVoo]Merge-sort with Transylvanian-saxon (German) folk dance - YouTube[/url]
* @return
*/
public static <T extends Comparable<T>> T[] mergeSort(T[] array) {
if (array.length == 1) {
return array;
}
T[] arrayLeft = mergeSort(Arrays
.copyOfRange(array, 0, array.length / 2));
T[] arrayRight = mergeSort(Arrays.copyOfRange(array, array.length / 2,
array.length));
return merge(arrayLeft, arrayRight);
}
private static <T extends Comparable<T>> T[] merge(T[] arrayLeft,
T[] arrayRight) {
@SuppressWarnings("unchecked")
T[] array = (T[]) new Comparable[arrayLeft.length + arrayRight.length];
int pointerRight = 0;
int pointerLeft = 0;
int result = 0;
while (pointerLeft < arrayLeft.length
|| pointerRight < arrayRight.length) {
if (pointerLeft >= arrayLeft.length) {
for (T t : Arrays.copyOfRange(arrayRight, pointerRight,
arrayRight.length)) {
array[result] = t;
result++;
pointerRight++;
}
} else if (pointerRight >= arrayRight.length) {
for (T t : Arrays.copyOfRange(arrayLeft, pointerLeft,
arrayLeft.length)) {
array[result] = t;
result++;
pointerLeft++;
}
} else {
if (arrayLeft[pointerLeft].compareTo(arrayRight[pointerRight]) < 0) {
array[result] = arrayLeft[pointerLeft];
pointerLeft++;
} else {
array[result] = arrayRight[pointerRight];
pointerRight++;
}
result++;
}
}
return array;
}
}
Als Test habe ich folgende JUnit Klasse gebaut:
Java:
package test;
import static org.junit.Assert.assertTrue;
import java.util.Random;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import sort.Sort;
public class TestSort {
private static Integer[] array;
private static Integer[] workingCopy;
@BeforeClass
public static void initial() {
Random random = new Random();
array = new Integer[4];
for (int i = 0; i < array.length; i++) {
array[i] = random.nextInt(100);
}
}
@Before
public void setUp() {
workingCopy = array.clone();
Sort.print(workingCopy);
}
@Test
public void mergeSort() {
workingCopy = Sort.mergeSort(workingCopy);
assertTrue(isSorted(workingCopy));
}
@After
public void tearDown() {
Sort.print(workingCopy);
workingCopy = null;
}
public boolean isSorted(Integer[] array) {
for (int i = 0; i < array.length - 1; i++) {
if (array[i + 1].compareTo(array[i]) < 0) {
return false;
}
}
return true;
}
}
Ich hab mich jetzt eine Zeit lang mit dem Debugger in Eclipse abgemüht und herausgefunden, dass mein Algorithmus prinzipiell funktioniert und mir das übergebene Array richtig sortiert. Aber im TestCase kracht es dann bei jedem Durchlauf. Casten funktioniert nicht. Wie kann ich das besser machen bzw. hinbiegen, dass der Test auch tatsächlich positiv durchläuft (es IST ja sortiert).
Viele Grüße & Vielen Dank,
Hoffe Ihr könnt mir helfen
transdenzentral