2

我有问题。我必须编辑标准的归并排序算法,改变数组两半之间的比率。标准合并排序将数组拆分为 2。但我必须用系数拆分它。

例子:

我有一个 10 元素数组,我必须用 0.2 的系数对其进行拆分。这意味着第一次将数组分成两部分:一个有 2 个元素,第二个有 8 个元素。由于是递归的,每次我拆分数组时都会应用这个比率。

问题:

如果系数 >=0.5,则没有概率。如果每次尝试的比率 <=0.5 都会导致堆栈溢出。

任何帮助将不胜感激!

这里的类:

public class Sort {
public static double coeff = 0.2;
public static void mergeSort(int[] a) {
    int vectorTemp[];
    vectorTemp = new int[a.length];
    mergeSort(a, vectorTemp, 0, a.length - 1);
}

private static void mergeSort(int[] a, int[] vectorTemp, int left, int right) {
    if (left < right) {
        int center = calculateMid(left, right);
        mergeSort(a, vectorTemp, left, center);
        mergeSort(a, vectorTemp, center + 1, right);
        merge(a, vectorTemp, left, center + 1, right);
    }
}

private static void merge(int[] a, int[] vectorAux, int posLeft, int posRight, int posEnd) {
    int endLeft = posRight - 1;
    int posAux = posLeft;
    int numElemen = posEnd - posLeft + 1;

    while (posLeft <= endLeft && posRight <= posEnd) {
        if ((a[ posLeft]) < (a[posRight])) {
            vectorAux[posAux++] = a[posLeft++];
        } else {
            vectorAux[posAux++] = a[posRight++];
        }
    }

    while (posLeft <= endLeft) {
        vectorAux[posAux++] = a[posLeft++];
    }

    while (posRight <= posEnd) {
        vectorAux[posAux++] = a[posRight++];
    }

    for (int i = 0; i < numElemen; i++, posEnd--) {
        a[posEnd] = vectorAux[posEnd];
    }
}
//this is the method i've added to calculate the size
private static int calculateMid(int left, int right){
    int mid = 0;
    int tot = right-left+1;
    int firstHalf = (int) (tot * coeff);
    mid = left + firstHalf;
    System.out.println(left+", "+mid +", "+firstHalf+", "+right + ", "+tot);

    return mid-1;
}

public static void main(String[] args) {
    int vector2[] = {10, 3, 15, 2, 1, 4, 9, 0};
    System.out.println("Array not ordered: " + Arrays.toString(vector2) + "\n");
    mergeSort(vector2);
    System.out.println("Array ordered: " + Arrays.toString(vector2));
}}
4

1 回答 1

1

这里有一个提示:

考虑一下calculateMid()二元素数组的返回值,以及mergeSort()之后会发生什么。

一旦你弄清楚那里发生了什么,也会清楚为什么代码适用于coeff >= 0.5.

于 2013-01-24T17:03:50.383 回答