合并排序算法在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++;
}
}
谢谢。
答案 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
只是调用者的便利。
mergeSort
和merge
的内部呼叫依赖于此属性。
在评论中你要求如何这样做:关键部分是merge
for(iaux = i; iaux <= f; iaux++)
{
a[iaux] = aux[kaux];
kaux++;
}
写入a
数组。