Или это какой-то близкий вариант?Java - Я на самом деле написал алгоритм сортировки слияния?
К счастью, это довольно быстро, я могу сортировать список из 15 000 000 элементов за 20 секунд (конечно, это зависит от скорости локального процессора).
Я рассмотрел исходный код для «реальных» реализаций слияния и ни один из них не удаленно выглядел как мой код. Алгоритм должен быть более или менее одинаковым (я думаю). Он использует вспомогательный метод, который объединяет два отсортированных списка в один объединенный отсортированный список. Затем метод MergeSort рекурсивно разбивает несортированный список пополам, пока он не попадает в списки с одним размером элемента, а затем объединяет их по мере того, как он завершает стек со вспомогательным методом, указанным ранее.
import java.util.*;
public class MergeSort{
public static void main(String []args){
List a = fillListRand(150);
List sorted = mergeSort(a);
System.out.println("Done.");
System.out.println("Unsorted: " + a.toString());
System.out.println("Sorted: " + sorted.toString());
}
public static List mergeSort(List unsorted) {
if(unsorted.size() == 1)
return unsorted;
return mergeLists(mergeSort(unsorted.subList(0,unsorted.size()/2)),
mergeSort(unsorted.subList(unsorted.size()/2,unsorted.size())));
}
public static List mergeLists(List a, List b) {
List newList = new ArrayList();
int aIndex = 0;
int bIndex = 0;
while((aIndex < a.size()) && (bIndex < b.size())) {
if((int)a.get(aIndex) > (int)b.get(bIndex)) {
newList.add(b.get(bIndex));
bIndex++;
}
else {
newList.add(a.get(aIndex));
aIndex++;
}
}
if(aIndex >= a.size())
newList.addAll(b.subList(bIndex,b.size()));
else if (bIndex >= b.size())
newList.addAll(a.subList(aIndex,a.size()));
return newList;
}
public static List fillListRand(int num) {
List newList = new ArrayList();
Random r = new Random();
for(int i = 0; i < num; i++) {
newList.add(r.nextInt(100));
}
return newList;
}
}
Спасибо!
Что именно так отличается. Кроме того, это работает; есть ли причина/выигрыш, как вы видите, если вы изменили его? – ChiefTwoPencils
Кроме того, вам не нужно проверять размеры индекса в конце. Вы можете просто «пока» сбрасывать оставшиеся элементы. Проверка все равно. – ChiefTwoPencils
Да, это хорошо работает для моих целей. Но мне было интересно, если бы я создал отклонение/вариант Merge Sort, который может быть не таким эффективным, как время или пространство. –