如何返回值合并排序

时间:2014-03-25 23:41:46

标签: algorithm sorting merge

合并排序算法在2个数字的集合中减少原始数组,并在2x2,3x3之后排序前2和2之后的集合(1collection x 1collection)。最后对数组进行排序。 问题是:如果第二个mergeSort()在调用mergeSort()和merge时没有将输出分配给数组,那么这个算法(Java中的实现)如何对数组进行排序?

我用以下方法调用算法:

int[] a = {4 , 8, 19, 7};
int[] sorted_array = mergeSort(a, 0, a.length-1);

static void mergeSort(int[] a)
{
    return mergeSort(a, 0, a.length - 1);
}

static int[] mergeSort(int[] a, int i, int f)
{
    if(i < f)
    {
        int h = (f + i) / 2;
        mergeSort(a, i, h);
        mergeSort(a, h + 1, f);
        merge(a, i, h, f);
    }
return a;
}

static void merge(int[] a, int i, int h, int f)
{
    int[] aux = new int[f - i + 1];
    int k = 0, iaux = i, jaux = h + 1, kaux;

while(iaux <= h && jaux <= f)
{
    if(a[iaux] < a[jaux])
    {
        aux[k] = a[iaux];
        iaux++;
    }
    else
    {
        aux[k] = a[jaux];
        jaux++;
    }

    k++;
}

while(iaux <= h)
{
    aux[k] = a[iaux];
    iaux++;
    k++;
}

while(jaux <= f)
{
    aux[k] = a[jaux];
    jaux++;
    k++;
}

kaux = 0;

for(iaux = i; iaux <= f; iaux++)
{
    a[iaux] = aux[kaux];
    kaux++;
}

}

谢谢。

2 个答案:

答案 0 :(得分:2)

在Java中,一切都是按值传递的。但重要的是要知道,这个价值是什么!

每个变量,不是原始数据类型(int,boolean等)都包含对象的引用。

在此行int[] a = {4 , 8, 19, 7};中,您创建了新数组,并在变量a中存储对此对象的引用。

如果调用此方法mergeSort(a, 0, a.length-1);,则将引用该数组的变量a的值复制到该方法中(第二个和第三个参数是原始数据类型,其值被复制,不参考)。因此在mergeSort方法中,它直接访问同一个数组。

答案 1 :(得分:1)

我只是略过了代码,但它似乎修改了输入数组。这意味着,如果你这样称呼它

int[] a = {4, 8, 19, 7};
mergeSort(a, 0, a.length-1);

然后您检查a的内容,您会发现它是{4, 7, 8, 19}。如果您删除了return a;功能末尾的mergeSort,那么仍可以使用。再次返回a只是调用者的便利。

mergeSortmerge的内部呼叫依赖于此属性。

在评论中你要求如何这样做:关键部分是merge

末尾的循环
for(iaux = i; iaux <= f; iaux++)
{
    a[iaux] = aux[kaux];
    kaux++;
}

写入a数组。