或者這是一些近似的變體?Java - 我真的寫了一個合併排序算法嗎?
幸運的是,它非常快,我可以在20秒內對15,000,000個元素進行排序(當然,這取決於本地CPU的速度)。
我已經看過「實際」合併排序實現的源代碼,它們都沒有看起來像我的代碼。該算法應該或多或少是相同的(我認爲)。它使用一個幫助器方法,將兩個已排序的列表組合成一個組合的排序列表。然後,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 2014-09-19 22:21:26
除此之外,您不必檢查最後索引的大小。你可以''同時'轉儲剩餘的元素。無論如何,支票都會發生。 – ChiefTwoPencils 2014-09-19 22:24:17
是的,它對我的目的非常有效。但我想知道是否創建了一個Merge Sort的偏差/變體,它可能不像Time或Space高效。 – 2014-09-19 22:24:44