У меня возникли две проблемы с моим кодом сортировки слияния в Java.Объединить неправильный вывод
Когда входной массив [3,4,2,1,0,6,8], я получаю выход [0, 1, 2, 3, 4, 6, 0], что явно неверно.
Я подозреваю, что способ, которым я написал свой код, не так оптимален, как мог бы быть. Пожалуйста, дайте мне знать, если вы сможете найти какие-либо улучшения. Я знаю, что в Интернете существует множество алгоритмов слияния, но я спрашиваю конкретно о том, как я написал свой код. Благодаря!
import java.util.Arrays; public class Main { static int[] mergeSort(int[] arr) { if (arr == null) return null; if (arr.length <= 1) return arr; int length = arr.length; int mid = arr.length/2; int[] left = Arrays.copyOfRange(arr, 0, mid); int[] right = Arrays.copyOfRange(arr, mid, length); int[] sortedLeft = mergeSort(left); int[] sortedRight = mergeSort(right); int leftSmallestIndex = 0; int rightSmallestIndex = 0; int leftLength = left.length; int rightLength = right.length; int[] sortedArr = new int[length]; outer: for (int i = 0; i < length; i++) { if (leftSmallestIndex >= leftLength) { while (rightSmallestIndex < rightLength) { sortedArr[i] = sortedRight[rightSmallestIndex]; rightSmallestIndex++; break outer; } } if (rightSmallestIndex >= rightLength) { while (leftSmallestIndex < leftLength) { sortedArr[i] = sortedLeft[leftSmallestIndex]; leftSmallestIndex++; break outer; } } if (sortedLeft[leftSmallestIndex] < sortedRight[rightSmallestIndex]) { sortedArr[i] = sortedLeft[leftSmallestIndex]; leftSmallestIndex++; } else { sortedArr[i] = sortedRight[rightSmallestIndex]; rightSmallestIndex++; } } return sortedArr; } public static void main(String[] args) { // write your code here int[] a = new int[] {3,4,2,1,0,6,8}; System.out.println(Arrays.toString(mergeSort(a))); } }
Спасибо. Что касается вашего второго комментария, что я мог бы объединиться только с одним массивом, вы думаете о чем-то вроде [this] (http://interactivepython.org/runestone/static/pythonds/SortSearch/TheMergeSort.html)? В этой связи им еще нужно создать два новых массива слева и справа.Это необходимо, или есть способ сделать это, не создавая эти два новых массива? – randomUser47534
Вам не нужно создавать новые массивы, так как у вас есть левый, средний и правый индексы. Поскольку ваш код написан, его нужно скопировать, поскольку вы используете '0' и' length', но его можно переписать, чтобы обойти индексы поддиапазонов для сортировки – dkatzel