Mergesort algo不工作

时间:2018-04-02 05:46:01

标签: java mergesort

我正在尝试实现一个无法正常工作的mergesort算法。合并排序的工作原理如下:

我。将未排序的列表分成n个子列表,每个子列表包含1个元素(1个元素的列表 被视为已排序)。

II。重复合并子列表以生成新排序的子列表,直到只剩下1个子列表。这将是排序列表。实现如下。

最初,这个方法是递归调用的,直到只有一个元素。

public void mergeSort(int low, int high) {

    if (low >= high) {
        return;
    }

    int middle = (low + high) / 2;

    // recursion for the merge
    mergeSort(low, middle);
    mergeSort(middle + 1, high);

    merge(low, middle, high);
}

这是提供的合并方法。

private void merge(int low, int middle, int high) {

    int i = low, j = middle;
    int index = low;

    for (int k = 0; k <= high; k++) {
        tempArray[k] = nums[k];
    }

    /*
      Copy the smallest values from either the left
      or the right side back to the original array
     */
    while ((i <= middle) && (j <= high)) {
        if (tempArray[i] <= tempArray[j]) {
            nums[index++] = tempArray[i++];
        } else {
            nums[index++] = tempArray[j++];
        }
    }

    // fill the left side of the array
    while (i < middle) {
        nums[index++] = tempArray[i++];
    }

    // fill the right side of the array
    while (j < high) {
        nums[index++] = tempArray[j++];
    }
  }

这里有什么问题?

输入为int[] arr = {12, 3, 4, 56, -7, 1};,输出为12 12 12 12 56 56

1 个答案:

答案 0 :(得分:0)

我修改了合并功能,现在开始工作了。特别是,j需要在中期j = middle+1

之后初始化
 private void merge(int low, int middle, int high) {

    int i = low, j = middle+1;
    int index = low;

    for (int k = 0; k <= high; k++) {
        tempArray[k] = nums[k];
    }

    /*
      Copy the smallest values from either the left
      or the right side back to the original array
     */
    while ((i <= middle) && (j <= high)) {
        if (tempArray[i] <= tempArray[j]) {
            nums[index++] = tempArray[i++];
        } else {
            nums[index++] = tempArray[j++];
        }
    }

    // fill the left side of the array
    while (i <= middle) {
        nums[index++] = tempArray[i++];
    }

    // fill the right side of the array
    while (j <= high) {
        nums[index++] = tempArray[j++];
    }
}