java - 在我的 Java 合并排序功能中,即使条件为假,它也会进入循环。为什么?
问题描述
在我的“合并”函数中,在while循环中,给定的条件是a!=null && b!=null
,但是当b
为null时,它仍然进入while循环,然后给出错误。
int[] merge(int[]a, int[]b)
{
int length = a.length+b.length;
int[]c = new int[length];
while (a!=null && b!=null)
{
if (a[0]<b[0])
{
c[length-1]=a[0];
a = tail(a);
}
else
{
c[length-1]=b[0];
b = tail(b);
}
}
return c;
}
int[] mergeSort(int[]a)
{
if (a.length==1)
return a;
int[] q = new int[a.length];
int[] l = new int[a.length/2];
int [] r = new int[a.length-l.length];
for (int i=0; i<l.length; i++)
{
l[i] = a[i];
}
for (int i=l.length; i<r.length; i++)
{
r[i-l.length] = a[i];
}
q = merge(mergeSort(l), mergeSort(r));
return q;
}
解决方案
a
我认为,当数组之一(或者或b
)已经为空,而另一个 - 仍然有元素时,您将面临这种情况。所以,在merge
函数中你应该考虑到这一点。
这是您的完整实现mergeSort
:
public class Answer {
public static void main(String[] args) {
int[] unsorted = new int[]{4,3,4,2,1,1,3,3,3,3,3,5,6,6,9,9,10,7,7,8};
System.out.println(Arrays.toString(mergeSort(unsorted)));
}
public static int[] mergeSort(int[]a) {
if (a.length == 1) return a;
int[] q = new int[a.length];
int[] l = new int[a.length / 2];
int [] r = new int[a.length - l.length];
for (int i = 0; i < l.length; i++) {
l[i] = a[i];
}
for (int i = 0; i < r.length; i++) {
r[i] = a[l.length + i];
}
q = merge(mergeSort(l), mergeSort(r));
return q;
}
private static int[] merge(int[]a, int[]b) {
int length = a.length + b.length;
int[] c = new int[length];
int p = 0;
while (a.length > 0 && b.length > 0) {
if (a[0] < b[0]) {
c[p++] = a[0];
a = tail(a);
} else {
c[p++] = b[0];
b = tail(b);
}
}
while (a.length > 0) {
c[p++] = a[0];
a = tail(a);
}
while (b.length > 0) {
c[p++] = b[0];
b = tail(b);
}
return c;
}
private static int[] tail(int[] a) {
int[] t = new int[a.length - 1];
for (int i = 0; i < t.length; i++) {
t[i] = a[i + 1];
}
return t;
}
}
推荐阅读
- vue.js - 如何在 Vue.js 中使用 Axios 设置获取请求的超时时间
- java - Spring Boot 应用程序需要在 @Configuration 类中定义默认 bean 以使用 @Value?
- ios - dyld:未加载库:未找到图像(库路径问题)使用 Xcode(9.4.1)
- android - 无法在 Espresso 中使用 onWebView 方法在 webview 中找到元素
- java - ND4J getRows 不适用于向量
- azure-active-directory - “权限不足,无法完成操作。” 尝试以编程方式创建新的 Azure AD 应用程序时
- angular - Angular 2中的输入类型编号自定义
- maven - 在 Maven 中如何为 settings.xml 中的每个存储库设置超时
- google-bigquery - BigQuery:将 UTC 转换为本地时间戳并分组
- uicollectionview - 滚动和使用 updateInteractiveMovementTargetPosition 时 Collectionview 跳转