迭代Java合并排序

时间:2016-11-22 07:18:24

标签: java data-structures

我正在尝试为分配制作Merge Sort的迭代版本。我从一个网站获得了Merge排序方法,并且我研究了应该合并数组的方法。但是我一直得到 IndexOutOfBounds异常

我一直在研究这个问题多个小时,我找不到错误。有人可以帮我找到解决这个问题的方法吗?

到目前为止,我有这个:

public static void MergeSort(int[] array) {
    int current;
    int leftStart;
    int arraySize = array.length - 1;
    for (current = 1; current <= arraySize; current = 2 * current) {
        for (leftStart = 0; leftStart <= arraySize; leftStart += 2 * current) {

            int mid = leftStart + current - 1;
            int right = getMin(leftStart + 2 * current - 1, arraySize);

            mergeArray(array, leftStart, mid, right);
        }

    }

}

public static void mergeArray(int[] array, int left, int mid, int right) {

    int leftArraySize = mid - left + 1;
    int rightArraySize = right - mid;

    int[] leftArray = new int[leftArraySize];
    int[] rightArray = new int[rightArraySize];

    for (int i = 0; i < leftArraySize; i++)
        leftArray[i] = array[left + i];

    for (int i = 0; i < rightArraySize; i++)
        rightArray[i] = array[mid + 1 + i];

    int leftPtr = 0;
    int rightPtr = 0;
    int tempPtr = leftPtr;

    while (leftPtr < leftArraySize && rightPtr < rightArraySize) {

        if (leftArray[leftPtr] <= rightArray[rightPtr])
            array[tempPtr++] = leftArray[leftPtr++];

        else
            array[tempPtr++] = rightArray[rightPtr++];
    }

    while (leftPtr <= left)
        array[tempPtr++] = leftArray[leftPtr++];

    while (rightPtr < right)
        array[tempPtr++] = rightArray[rightPtr++];

}

public static int getMin(int left, int right) {
    if (left <= right) {
        return left;
    } else {
        return right;
    }
}

任何形式的帮助都将受到高度赞赏!

谢谢!

2 个答案:

答案 0 :(得分:1)

合并排序算法是一种经典的Divide and Conquer算法。

  1. 将问题分成较小的子问题
  2. 通过递归电话征服。
  3. 将子问题的解决方案合并为原始问题的解决方案
  4. 合并伪代码:

    C = output[length = n]
    A = 1st sorted array[n/2]
    B = 2st sorted array[n/2]
    i = 1
    j = 1
    for k = 1 to n
        if A[i] < B[j]
            C[k] = A[i]
            i++
        else B[j]<A[i]
            C[k] = B[j] 
            j++
    end (ignores end cases)
    

    所以你的源代码问题是这一行:

    array[tempPtr++] = leftArray[leftPtr++];
    

    请改为伪代码的逻辑:

    if (leftArray [leftPtr ] <= rightArray[rightPtr ])
    {
        array[tempPtr] = leftArray [leftPtr];
        leftPtr++;
    }
    else
    {
        array[tempPtr] = rightArray[rightPtr];
        rightPtr++;
    }
    

答案 1 :(得分:0)

尝试此代码已成功执行: mergeArray()方法中只有小错误:

array[tempPtr++] = leftArray[leftPtr++];

不在数组中递增... 替换

 array[tempPtr] = leftArray [leftPtr];
       leftPtr++;

最终代码:比较我的代码,您将获得它。

  public static void MergeSort(int[] array) {
 int current;
 int leftStart;
 int arraySize = array.length;
 for (current = 1; current <= arraySize-1; current = 2 * current) {
for (leftStart = 0; leftStart < arraySize-1; leftStart += 2 * current) {

    int mid = leftStart + current - 1;
    int right = getMin(leftStart + 2 * current - 1, arraySize-1);

    mergeArray(array, leftStart, mid, right);
}}}

 static void printArray(int A[])
 { 
 int i;
  for (i=0; i < A.length; i++)
    System.out.println(A[i]);
    }

 static void mergeArray(int array[], int left, int mid, int right)
   {
   int leftArraySize  = mid - left + 1;
int rightArraySize =  right - mid;

      int[] leftArray  = new int[leftArraySize];
int[] rightArray = new int[rightArraySize];

for (int i = 0; i < leftArraySize ; i++)
    leftArray [i] = array[left + i];
for (int j = 0; j < rightArraySize; j++)
    rightArray[j] = array[mid + 1+ j];

    int leftPtr  = 0;
    int rightPtr  = 0;
    int tempPtr  = left;
while (leftPtr < leftArraySize  && rightPtr  < rightArraySize)
{
    if (leftArray [leftPtr ] <= rightArray[rightPtr ])
    {
        array[tempPtr] = leftArray [leftPtr];
       leftPtr++;
    }
    else
    {
        array[tempPtr] = rightArray[rightPtr];
        rightPtr++;
    }
    tempPtr++;
}

 while (leftPtr < leftArraySize )
{
    array[tempPtr++] = leftArray [leftPtr++];

    leftPtr++;
    tempPtr++;
}

while (rightPtr < rightArraySize)
{
    array[tempPtr++] = rightArray[rightPtr++];

    rightPtr++;
    tempPtr++;
}   }

   public static int getMin(int left, int right) {
   if (left <= right) {
return left;
} else {
   return right;
 }}