Я могу считать новым в Java. Я боролся с одним вопросом, который был дан нам нашим профессором в нашей школе. Я должен сделать естественный алгоритм сортировки слиянием, который должен каждый раз находить два отсортированных подматрицы и объединять их (что является версией сортировки слияния снизу вверх). Но я застрял здесь мой кодJava Natural Merge Сортировка
public class NaturalMergeMine {
private static Comparable[] aux;
public static void sort(Comparable[] a) {
aux = new Comparable[a.length];
sort(a, 0, a.length - 1);
}
public static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i += 1) {
if (a[i - 1].compareTo(a[i]) < 0) {
return false;
}
}
return true;
}
private static void sort(Comparable[] a, int lo, int hi) {
int i = lo;
int j = 0;
int mid = 0;
int az = 0;
while (true) {
i = 0;
System.out.println("outter");
while (i < a.length) {
System.out.println("inner 1");
if (i == a.length - 1) {
break;
} else if (a[i].compareTo(a[i + 1]) < 0) {
break;
}
i++;
}
j = i + 1;
while (j < a.length) {
System.out.println("inner 2");
if (j == a.length - 1) {
break;
} else if (a[j].compareTo(a[j + 1]) < 0) {
break;
}
j++;
}
mid = lo + (j - lo)/2;
Merge(a, lo, mid, j);
lo = 0;
if (isSorted(a)) {
break;
}
}
}
public static void Merge(Comparable[] a, int lo, int mid, int hi) {
int i = lo;
int j = mid + 1;
for (int k = lo; k <= hi; k++) {
aux[k] = a[k];
}
for (int k = lo; k <= hi; k++) {
if (i > mid) {
a[k] = aux[j++];
} else if (j > hi) {
a[k] = aux[i++];
} else if (aux[i].compareTo(aux[j]) < 0) {
a[k] = aux[j++];
} else {
a[k] = aux[i++];
}
}
}
public static void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
public static void main(String[] args) {
Integer[] arr = {6, 4, 5, 7, 8, 3, 2, 1};
sort(arr);
show(arr);
}
}
, что происходит в том, что она не сливаясь правильно, и он идет в бесконечном цикле в цикле Outter, что, поскольку он не отсортирован должным образом. Есть ли кто-нибудь, кто может мне лучше посоветовать или сказать мне ошибку, которую я здесь делаю. Заранее спасибо.
Благодарим вас, но это не стандартная реализация сортировки слияния сверху вниз. У меня проблема в том, чтобы найти 2 отсортированных подмассива, и как только я их найду, я должен объединить их. И это может быть не совсем половина массива. – adropintheocean
Это стандартный алгоритм сортировки слиянием, а не алгоритм сортировки естественного слияния. ОП четко заявил, что проблема находится внутри части слияния. Если вы обнаружили и обработали какую-то ошибку в этой части, было бы полезно, если бы вы подробно объяснили изменения. – Turing85
На самом деле я реализовал метод слияния в стандартном алгоритме сортировки слияния, и он работал правильно. Здесь я использовал один и тот же метод слияния. Единственной частью, которую я изменил в коде, который я написал выше, является метод sort (Comparable [] a, int lo .....). Но он не делает то, что я изначально желал. – adropintheocean