2012-10-25 14 views
0

我寫了一個適當的合併排序算法,用於排序隨機大小(100,000個元素或更多)的大量數據。我正在考慮在數據幾乎排序時進行插入排序,以使算法運行得更快一些。我想知道這是否可以用mergesort?正在完成一個就地mergesort算法與插入排序可能/可行?

這是我的一些代碼。

public static void merge(ArrayList<String> list, int low, int high) { 
    if (low < high) { 
     int mid = (low + high)/2; 
     merge(list, low, mid); 
     merge(list, mid + 1, high); 
     mergeSort(list, low, mid, high); 
    } 

} 

public static void mergeSort(ArrayList<String> list, int first, int mid, 
     int last) { 
    int left = first; 
    int right = mid + 1; 
    String holder = ""; 

    // if mid <= mid+1 skip merge 
    if (compareTo(list.get(mid), list.get(right)) <= 0) { 
     return; 
    } 

    while (left <= mid && right <= last) { 
     // if left index <= right index then just add to left 
     if (compareTo(list.get(left), list.get(right)) <= 0) { 
      left++; 
     } else { 
      holder = list.get(right); 
      copyList(list, left, right - left);//moves everything from left to right-left      up one index in the arraylist 
      list.set(left, holder); 

      left++; 
      mid++; 
      right++; 
     } 
    } 
    // what is left is in place 

} 

public static void copyList(ArrayList<String> source, int srcPos, int length) { 
    String temp1 = ""; 
    String temp2 = source.get(srcPos); 
    for (int i = 0; i < length; i++) { 
     temp1 = source.get(srcPos + 1); 
     source.set(srcPos + 1, temp2); 
     temp2 = temp1; 
     srcPos++; 
    } 
} 

現在,我想通過計數器實現插入排序的元素個數當我第一次把它們到數組列表,然後改變了我的合併方法爲以下的。

public static void merge(ArrayList<String> list, int low, int high) { 
    if(high-low==dataSize-1){ 
     int mid = (low + high)/2; 
     merge(list, low, mid); 
     merge(list, mid + 1, high); 
     insertionSort(list); 
    }else if (low < high) { 
     int mid = (low + high)/2; 
     merge(list, low, mid); 
     merge(list, mid + 1, high); 
     mergeSort(list, low, mid, high); 
    } 

} 

但是,這實際上使我的算法採取永恆。我猜我做錯了,算法是採取n^2運行,因爲數據是完全隨機生成的,沒有接近幾乎排序的地方。

我在做什麼錯?有什麼建議麼?我的猜測是,因爲它就地合併排序它不會工作。

謝謝!

回答

0

這樣的算法很複雜,容易出錯。我實現了一個非常相似的東西:一個in-place stable merge sort。它也使用插入排序的小型子列表。我建議看看source code並將其與你正在做的事情進行比較。您可能還對in-place stable quicksort感興趣。

除非我錯了你的實現不穩定(它可能會重新安排相同的元素)。根據使用情況,這可能是也可能不是問題。

另外,看起來你的實現是O(n^2),因爲copyList方法是O(n),它被調用n次。

關於insertionSort:什麼是dataSize,爲什麼使用equals來比較它?你不想用<代替嗎?如果你這樣做,else if (low < high)是多餘的(它總是如此)。