Java Mergesort字符串

时间:2011-12-10 16:34:58

标签: java string sorting mergesort

我试图创建一个方法,允许我使用mergesort对Java中的字符串数组进行排序。我查看了一些代码示例并制作了我自己的算法,但它似乎没有用,我在查找问题时遇到了一些困难。代码如下:

/*
 * Sorting methods, implemented using mergesort to sort the array of names
 * alphabetically
 */
public String[] sort(String[] array) {
    // check if the number of elements < 2
    if (array.length > 1) {

        // divide into two smaller arrays
        // determine length of two smaller arrays
        int arrLen1 = array.length;
        int arrLen2 = array.length - arrLen1;

        // populate smaller arrays with elements from initial array
        String[] array1 = new String[arrLen1];
        String[] array2 = new String[arrLen2];

        for (int i = 0; i < arrLen1; i++) {
            array[i] = array1[i];
        }

        for (int i = arrLen1; i < array.length; i++) {
            array[i] = array2[i];
        }

        // now that we have the two halves, we can recursively call sort() on each to sort them
        array1 = sort(array1);
        array2 = sort(array2);

        // three counters are needed to keep track of where we are in the arrays, one for pos in final array, and one for each of the two halves
        // i => pos in main array
        // j => pos in array1
        // k => pos in array2
        int i = 0, j = 0, k = 0;

        while (array1.length != j && array2.length != k) {
            if (array1[i].compareTo(array2[i]) < 0) {
                // copy current element of array1 to final array as it preceeds array2's current element
                array[i] = array1[j];

                // increment the final array so we dont overwrite the value we just inserted
                i++;
                // increment array1 which we took the element from so we dont compare it again
                j++;
            }
            // If the element in array2 preceeds the element in array1

            else {
                // copy current element of array1 to final array as it preceeds array1's current element
                array[i] = array2[j];
                // increment the final array so we dont overwrite the value we just inserted
                i++;
                // increment array2 which we took the element from so we dont compare it again
                k++;
            }
        }

        // at this point one of the sub arrays have been exhausted, and no more elements to compare
        while (array1.length != j) {
            array[i] = array1[j];
            i++;
            j++;
        }

        while (array2.length != k) {
            array[i] = array2[k];
            i++;
            k++;

        }
    }

    return array;
}

1 个答案:

答案 0 :(得分:0)

对于你在尝试进行任何比较之前尝试递归排序的人。

编写代码的方式,array1总是等于数组,然后再次在array1上调用sort,这意味着你只是不断绕过圆圈。