4

所以基本上有两个单独的预排序数组,你必须组合它们并对它们进行排序(当然没有 sort() 方法)。这是我的代码:

public static void main(String[] args) {

    int a [] = {3,5,7,9,12,14, 15};
    int b [] = {6 ,7, 10};
    int j = 0;

    //output array should be 3,5,6,7,7,9,10,12,14,15

    int c [] = new int[a.length+b.length];//10 values

    for (int i = 0;i<b.length;i++){
        while(b[i]>a[j]){
            c[j] = a[j] ;
            j++;    
         }

        if(b[i] == a[j]){
            c[j] = b[i];
            c[j+1] = a[j];
        }

        c[j] = b[i];
        j++;
    }

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

我猜我得到的零是由于其中一个布尔值(<&>)中的错误造成的,但我似乎无法弄清楚。前 4 个效果很好,但是一旦我到达重复的 7 个,它就会变得疯狂。

请帮助我理解,不要只是更改代码。

4

6 回答 6

6

这应该是一种简单的方式:

public static void main(String[] args) {

    int a [] = {3,5,7,9,12,14, 15};
    int b [] = {6 ,7, 10};
    int j = 0, k = 0;

    //output array should be 3,5,6,7,7,9,10,12,14,15

    int c [] = new int[a.length+b.length];//10 values

    // we're filling c with the next appropriate number
    // we start with checking a[0] and b[0] till we add
    // all the elements
    for (int i = 0; i < c.length; i++) {
        // if both "a" and "b" have elements left to check
        if (j < a.length && k < b.length) {
            // check if "b" has a smaller element
            if (b[k] < a[j]) {
                // if so add it to "c"
                c[i] = b[k];
                k++;
            }
            // if "a" has a smaller element
            else {
                // add it to "c"
                c[i] = a[j];
                j++;
            }       
        }
        // if there are no more elements to check in "a"
        // but there are still elements to check in "b"
        else if (k < b.length) {
            // add those elements in "b" to "c"
            c[i] = b[k];
            k++;
        }
        // if there are no more elements to check in "b"
        // but there are still elements to check in "a"
        else {
            // add those elements in "a" to "c"
            c[i] = a[j];
            j++;
        }
    }

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

希望能帮助到你。

于 2012-06-22T21:44:01.097 回答
1

你可以试试这段代码。

public static void main(String[] args) {
    int a[] = { 3, 5, 7, 9, 12, 14, 15 };
    int b[] = { 6, 7, 10 };

    // output array should be 3,5,6,7,7,9,10,12,14,15

    int alen = a.length;
    int blen = b.length;
    int c[] = new int[a.length + b.length];// 10 values

    int s[] = null;
    int[] l = null;

    if (alen < blen) {
        s = a;
        l = b;
    } else {
        s = b;
        l = a;
    }
            // Constructing Combined Array
    for (int i = 0, p = 0; i < c.length; i++, p++) {
        if (i == s.length) {
            p = 0;
        }
        if (i < s.length) {
            c[i] = s[p];
        } else {
            c[i] = l[p];
        }
    }
            //Sorting the C array 
    for (int i = 1; i < c.length; i++) {
        int j = i;
        int B = c[i];
        while ((j > 0) && (c[j - 1] > B)) {
            c[j] = c[j - 1];
            j--;
        }
        c[j] = B;
    }

    for (int i = 0; i < c.length; i++)
        System.out.print(c[i]);
}
于 2012-06-22T21:53:35.327 回答
0

使用aiandbi作为源数组ci中的索引和目标数组的索引。

你只需要一个循环。

尽量保持这一点非常清晰,并c在每次迭代中精确地推进一个元素。

在循环中,检查是否到达了一个数组的末尾。如果是这样,只需从另一个数组中获取一个元素。否则,只取 and 的较小元素a[ai]b[bi]增加相应的索引。

在合并排序中(或在任何需要并行遍历两个数组的代码中)很容易犯错误,通过思考“嘿,我可以使用 while 循环而不是只做一个 if”,但是你通常有两个循环嵌套在第三个循环中,并且对于每个循环,您都必须进行正确的边界检查,并且通常不会显着提高性能。

ps 做一个主循环,然后在主循环之后做两个清理循环就可以了,如果没有必要,请避免嵌套循环,特别是在面试中,这也可能在计算运行时时引起混乱。

于 2012-06-22T21:37:45.537 回答
0

实际上最好说合并(而不是组合)两个数组。

将排序数组AB[0..n-1]合并到结果C[0..m+n-1] 的简单算法(取自这篇文章) :

  1. 相应地引入读取索引ij来遍历数组A[0..m-1]B。引入 write-index k来存储结果数组中第一个空闲单元格的位置。默认情况下i = j = k = 0。
  2. 在每一步:如果两个索引都在范围内(i < mj < n ),则选择( A[i]B[j] )的最小值并将其写入C[k]。否则转到步骤 4。
  3. 将位于最小值处的算法的数组的k和索引增加一。重复步骤 2。
  4. 将数组中的剩余值(索引仍在范围内)复制到结果数组中。

希望能帮助到你。

于 2012-06-22T21:31:07.407 回答
0

试试这个,你的错误是你对数组 A 和数组 C 使用相同的细胞索引:

public class MainClass {
      public static void main(String[] args) {
        int[] arrayA = { 23, 47, 81, 95 };
        int[] arrayB = { 7, 14, 39, 55, 62, 74 };
        int[] arrayC = new int[10];

        merge(arrayA, arrayA.length, arrayB, arrayB.length, arrayC);
        for (int i : arrayC) {
          System.out.println(i);

        }
      }

      public static void merge(int[] arrayA, int sizeA, int[] arrayB, int sizeB, int[] arrayC) {
        int arrayAIndex = 0, arrayBIndex = 0, arrayCIndex = 0;

        while (arrayAIndex < sizeA && arrayBIndex < sizeB)
          if (arrayA[arrayAIndex] < arrayB[arrayBIndex])
            arrayC[arrayCIndex++] = arrayA[arrayAIndex++];
          else
            arrayC[arrayCIndex++] = arrayB[arrayBIndex++];

        while (arrayAIndex < sizeA)
          arrayC[arrayCIndex++] = arrayA[arrayAIndex++];

        while (arrayBIndex < sizeB)
          arrayC[arrayCIndex++] = arrayB[arrayBIndex++];
      }
    }

这是另一个版本

// size of C array must be equal or greater than
// sum of A and B arrays' sizes
public void merge(int[] A, int[] B, int[] C) {
      int i, j, k, m, n;
      i = 0;
      j = 0;
      k = 0;
      m = A.length;
      n = B.length;
      while (i < m && j < n) {
            if (A[i] <= B[j]) {
                  C[k] = A[i];
                  i++;
            } else {
                  C[k] = B[j];
                  j++;
            }
            k++;
      }
      if (i < m) {
            for (int p = i; p < m; p++) {
                  C[k] = A[p];
                  k++;
            }
      } else {
            for (int p = j; p < n; p++) {
                  C[k] = B[p];
                  k++;
            }
      }
}
于 2012-06-22T21:34:12.070 回答
0
public class Combinearray {

    public static void main(String[] args) {
        int[] array1= {5,4,6,2,1};
        int[] array2= {2,5,8,4,1,6,4};
        int m=array1.length;
        int n=array2.length;
        int[] array3=new int[m+n];
        int a=1;
        for(int i=0;i<m;i++) {

            array3[i]=array1[i];//array1 is copied to array3
        }
        for(int i=0;i<n;i++) {
            array3[m-1+a]=array2[i];//array2 is copied to array3
            a++;
        }
        //array3 is combined array
         int l=array3.length;
            int temp[]=new int[l];
            for(int i=0;i<l;i++) {
                for(int j=i+1;j<l;j++) {
                    if(array3[i]>array3[j]) {
                        temp[i]=array3[i];
                        array3[i]=array3[j];
                        array3[j]=temp[i];
                    }
                }
            }
            System.out.println("sorted array is ");
            System.out.print("[");
            for(int i=0;i<l;i++) {
                System.out.print(array3[i]+" ");  
            }
            System.out.print("]");

    }

}
于 2018-07-19T11:42:17.553 回答