如何解决合并排序递归麻烦
我一直在尝试进行合并排序,但合并部分却减少了,这只是递归拆分,这给我带来了一些麻烦。左列表和右列表将分别进行合并和排序,并且不会在每次递归遍历之间传递。我不确定递归在做什么或在不取消整个除法的情况下如何解决它。
public static int[] mergeSort(int[] x)
{
divide(x);
return sorted;
}
public static void divide(int[] x)
{
int midP;
if((x.length/2f) == 1.5f) //the left side of the list will always be larger
midP = 2;
else
midP = x.length/2;
if(midP == 0) //if the list contains one number end
return;
System.out.println("mid: " + midP);
int[] left = new int[midP];
int[] right = new int[x.length - midP];
for(int i = 0; i < midP; i++) //fills the left list
left[i] = x[i];
for(int i = midP; i < x.length; i++) //fills the right list
right[i-midP] = x[i];
divide(left);
divide(right);
sorted = merge(left,right);
}
public static int[] merge(int[] x,int[] y)
{
int[] mergedList = new int[x.length + y.length];
int counter = 0,xCounter = 0,yCounter = 0,high = 0;
while(xCounter < x.length && yCounter < y.length)
{
printArray(x);
printArray(y);
System.out.println("checking: " + x[xCounter] + " " + y[yCounter]);
if(x[xCounter] < y[yCounter])
{
mergedList[counter] = x[xCounter];
high = y[yCounter];
if(xCounter != x.length)
xCounter++;
}
else
{
mergedList[counter] = y[yCounter];
high = x[xCounter];
if(yCounter != y.length)
yCounter++;
}
counter++;
}
mergedList[counter] = high;
return mergedList;
}
public static void printArray(int[] x)
{
System.out.print("list: ");
for(int i = 0; i < x.length; i++)
System.out.print(x[i] + " ");
System.out.println();
}
解决方法
在使用递归方法时,在这种情况下,使用静态变量或实例变量(例如sorted
)非常棘手。发生的事情是sorted
在递归调用上被设置和重置,并且可能很难预测在任何给定时间的价值。如果仅使用局部变量,则递归函数更易于理解。因此,更改您的divide
函数,使其返回已排序的数组,并使用递归调用的返回值:
public static int[] divide(int[] x) {
... your existing divide logic ...
int[] leftSorted = divide(left);
int[] rightSorted = divide(right);
return merge(leftSorted,rightSorted);
}
别忘了还要更改主入口点:
public static int[] mergeSort(int[] x) {
return divide(x);
}
您似乎仍然在merge
方法中发现错误:
int[] x = {5,4,1,2,3};
int[] sorted = mergeSort(x);
得出1 2 3 4 0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。