关于合并算法的问题

时间:2010-05-26 09:24:02

标签: java algorithm

嗨我有疑问我知道这个问题在某种程度上是胡说八道,但让我看看我有代码在一个有序数组中合并两个有序数组这里是java中的代码

public class Merge {

    public static void main(String[]args){

       int a[]=new int[]{7,14,23,30,35,40};
       int b[]=new int[]{5,8,9,11,50,67,81};
       int c[]=new int[a.length+b.length];
       int al=0;
       int bl=0;
       int cl=0;

       while (al<a.length && bl<b.length)              
          if (a[al]<b[bl])
              c[cl++]=a[al++];   
          else  
              c[cl++]=b[bl++];


       while (al<a.length)
          c[cl++]=a[al++];

       while (bl<b.length)
          c[cl++]=b[bl++];

       for (int j=0;j<c.length;j++){
          System.out.println(c[j]);
       }


    }
}

问题是,如果我们在这里写{}括号

,为什么不起作用
while (al<a.length && bl<b.length){
}

4 个答案:

答案 0 :(得分:3)

这取决于您放置括号的位置,您当前的代码相当于:

while (al<a.length && bl<b.length) {
    if (a[al]<b[bl]) {
       c[cl++]=a[al++];
    } else {
       c[cl++]=b[bl++];
    }
}

如果您将括号放在任何其他位置,您将更改代码的语义。

答案 1 :(得分:1)

如果您在使用合并排序算法时遇到问题,请查看this Wiki文章。 此外,在发布代码时,最好为变量提供更具描述性的名称,以及在{ }while语句中添加大括号(if

答案 2 :(得分:1)

如果我的猜测是正确的,你的问题是......为什么以下代码不起作用?

while (al<a.length && bl<b.length)
{ //<-- bracket here

    if (a[al]<b[bl])
      c[cl++]=a[al++];


     else  
     c[cl++]=b[bl++];


    while (al<a.length)
      c[cl++]=a[al++];

    while (bl<b.length)
     c[cl++]=b[bl++];
} //<--- Bracket here

如果是这种情况,

while (al<a.length && bl<b.length)
第一次迭代后

会失败。

答案 3 :(得分:1)

一个好建议:始终用花括号围绕所有逻辑代码块:

if (expression) { 
   //some code 
}

if (expression) {
   //one line of code
} else {
   //another line
}

while (conditionIsTrue) {
   //just 1 line here but surrounded with curly braces 
}

它可以帮助您避免所有C风格语言中出现的许多不明显的错误。

如果您了解只有一行应该在块中并且您有意识地省略大括号以使代码更具可读性,那么这些错误是如何出现的?非常简单!想象一下代码:

if (a > b) 
   result = a;

第一眼看起来更优雅

if (a > b) {
   result = a;
}

甚至

if (a > b)
{
   result = a;
}

但现在让我们假设您要为代码添加一些调试信息:

if (a > b)
   System.out.println ("a > b, we're inside if-block");
   result = a;                            //This line is ALWAYS executed

正如你所看到的那样,犯错很容易。所以,不要忽略大括号,事情会更容易。