Печать всего процесса mergeSort
У меня есть спецификация, которая требует от меня создания графического интерфейса с текстовым полем и тремя кнопками. Текстовое поле будет содержать 5 чисел и сохранит их в виде массива, и в зависимости от того, какую кнопку вы щелкнете, они будут отсортированы с помощью bubbleSort, mergeSort или quickSort, отображая каждый сделанный шаг.
Пример для того, что мой вывод bubbleSort будет показывать, что я имею в виду:
5 3 2 6 2 (Пуск)
3 5 2 6 2
[Надрез]
2 2 3 5 6
2 2 3 5 6 (Конец)
Прежде чем я сделаю GUI, который должен быть достаточно простым (цель спецификации - научить сортировке, а не механике GUI), я подумал, что было бы неплохо создать отдельный класс для каждого из них и протестировать их по-своему. сеть, чтобы убедиться, что я понимаю логику. bubbleSort был достаточно прост, и я, кажется, добился прогресса в быстрой сортировке, но мне не удалось заставить mergeSort работать так, как я хочу.
Я попробовал довольно много вещей, включая создание внешнего счетчика, который заставляет следующую строку начинаться, когда напечатано 5 терминов, но все безрезультатно. Единственный другой ресурс, который мне удалось найти по этому вопросу, - это здесь: Как распечатать пошаговый процесс в MergeSort, но у меня возникают проблемы с пониманием того, как мне следует применять принятый ответ, что, кажется, может иметь смысл,
Мой текущий код выглядит следующим образом с закомментированными ошибочными отпечатками. Однако сама логика сортировки работает нормально.
public class MergeSort {
public static void mergeSort(int[] list) {
if (list.length > 1) {
int[] firstHalf = new int[list.length / 2];
System.arraycopy(list, 0, firstHalf, 0, list.length / 2);
mergeSort(firstHalf);
int secondHalfLength = list.length - list.length / 2;
int[] secondHalf = new int[secondHalfLength];
System.arraycopy(list, list.length / 2, secondHalf, 0,
secondHalfLength);
mergeSort(secondHalf);
merge(firstHalf, secondHalf, list);
// for (int j = 0; j < list.length; j++) {
// System.out.print(list[j] + " ");
// counter++;
// if (counter == size) {
// System.out.println();
// counter = 0;
// }
// }
// System.out.println();
}
}
public static void merge(int[] list1, int[] list2, int[] temp) {
int current1 = 0;
int current2 = 0;
int current3 = 0;
while (current1 < list1.length && current2 < list2.length) {
if (list1[current1] < list2[current2]) {
temp[current3++] = list1[current1++];
// for (int j = 0; j < current3; j++) {
// System.out.print(temp[j] + " ");
// }
// for (int j = 0; j < current1; j++) {
// System.out.print(list1[j] + " ");
// }
System.out.println();
} else {
temp[current3++] = list2[current2++];
}
}
while (current1 < list1.length) {
temp[current3++] = list1[current1++];
}
while (current2 < list2.length) {
temp[current3++] = list2[current2++];
}
}
public static void main(String args[]) {
int[] list = { 5, 3, 2, 6, 2 };
for (int j = 0; j < list.length; j++) {
System.out.print(list[j] + " ");
}
System.out.println();
mergeSort(list);
for (int j = 0; j < list.length; j++) {
System.out.print(list[j] + " ");
}
}
}
Любое понимание будет с благодарностью!
1 ответ
Попробуйте что-то вроде этого
public static void mergeSort(int[] list) {
if (list != null && list.length > 1) {
System.out.println("mergeSort - ");
System.out.println(Arrays.toString(list));
int[] firstHalf = new int[list.length / 2];
System.arraycopy(list, 0, firstHalf, 0, list.length / 2);
System.out.println("The first half (before) - ");
System.out.println(Arrays.toString(firstHalf));
mergeSort(firstHalf);
System.out.println("The first half (after) - ");
System.out.println(Arrays.toString(firstHalf));
int secondHalfLength = list.length - list.length / 2;
int[] secondHalf = new int[secondHalfLength];
System.arraycopy(list, list.length / 2, secondHalf, 0,
secondHalfLength);
System.out.println("The second half (before) - ");
System.out.println(Arrays.toString(secondHalf));
mergeSort(secondHalf);
System.out.println("The second half (after) - ");
System.out.println(Arrays.toString(secondHalf));
merge(firstHalf, secondHalf, list);
System.out.println("After - ");
System.out.println(Arrays.toString(list));
}
}