合并3个排序的数组

时间:2018-01-23 18:33:26

标签: java algorithm mergesort

public class array12 {
    static void merge_sort(int A[], int start, int end) {
        if (end - start > 1) {
            int middle1 = (2 * start + end + 1) / 3 - 1;
            int middle2 = 2 * middle1 - start + 1;

            merge_sort(A, start, middle1); 

            merge_sort(A, middle1 + 1, middle2);

            merge_sort(A, middle2 + 1, end);

            merge(A, start, middle1, middle2, end);
        }
    }

    static void merge(int[] x, int start, int middle1, int middle2, int end) {
        int n1 = middle1 - start + 1;

        int n2 = middle2 - middle1;

        int n3 = end - middle2;

        int left[] = new int[n1];  // defining and initialising three arrays .

        int mid[] = new int[n2];

        int right[] = new int[n3];

        for (int i = 0; i < left.length; i++) {
            left[i] = x[i + start];
        }

        for (int i = 0; i < mid.length; i++) {
            mid[i] = x[i + middle1 + 1];
        }

        for (int i = 0; i < right.length; i++) {
            right[i] = x[i + middle2 + 1];
        }

        int i = 0;
        int j = 0;
        int k = 0;
        int c = start;


        // finding minimum element from the three arrays .

            while (i < n1 && j < n2 && k < n3) {
            if (left[i] <= mid[j] && left[i] <= right[k]) {
                x[c] = left[i];
                i++;
                c++;
            } else if (mid[j] <= left[i] && mid[j] <= right[k]) {
                x[c] = mid[j];
                j++;
                c++;
            } else {
                x[c] = right[k];
                k++;
                c++;
            }
        }

        // now only two arrays are left to be compared

        while (i < n1 && j < n2) {
            if (left[i] <= mid[j]) {
                x[c] = left[i];
                i++;
                c++;
            } else {
                x[c] = mid[j];
                j++;
                c++;
            }
        }

        while (j < n2 && k < n3) {
            if (mid[j] <= right[k]) {
                x[c] = mid[j];
                j++;
                c++;
            } else {
                x[c] = right[k];
                k++;
                c++;
            }
        }

        while (i < n1 && k < n3) {
            if (left[i] <= right[k]) {
                x[c] = left[i];
                i++;
                c++;
            } else {
                x[c] = right[k];
                k++;
                c++;
            }
        }

        // now only single array is left out of left[] , mid[] and right[].
        while (i < n1) {
            x[c] = left[i];
            i++;
            c++;
        }

        while (j < n2) {
            x[c] = mid[j];
            j++;
            c++;
        }

        while (k < n3) {
            x[c] = right[k];
            k++;
            c++;
        }

        System.out.println("");

        // printing array elements after every merge operation .

        for (int e = 0; e < x.length; e++) {
            System.out.print(x[e] + "  ");
        }
    }

    public static void main(String[] args) {

        int[] x = new int[9];

        for (int i = 0; i < x.length; i++) {
            x[i] = x.length - i;
        }
        System.out.println("initial array is : ");
        for (int i = 0; i < x.length; i++) {
            System.out.print(x[i] + "  ");
        }

        System.out.println("");
        merge_sort(x, 0, x.length - 1);

        System.out.println("");
        System.out.println("");
        System.out.println(" sorted array is : ");

        for (int i = 0; i < x.length; i++) {
            System.out.print(x[i] + "  ");
        }
    }
}

我正在尝试合并3个排序的数组。我已经能够开发出等于3的幂的数组大小的代码。我无法用其他一些数组大小来实现它。我试图改变middle1和middle2的值,但遇到了严重的麻烦。设定他们的价值是主要关注点。合并步骤非常简单,不会造成问题。 我的代码需要进行哪些更改才能使其适用于任何数组大小?可以用这种方法实现吗?我不希望三个数组中的任何一个的大小,左[],中[和右[]在任何时候都为零。 请帮忙。

3 个答案:

答案 0 :(得分:0)

Here's a similar answer to YCF_L's, but simplified (still uses Java 8):

public static int[] sortMultipleArrays(int[]... arrays) {
    return Arrays.stream(arrays)
                 .flatMapToInt(Arrays::stream)
                 .sorted()
                 .toArray();
}

Output:

[1, 2, 3, 5, 6, 7, 9, 10, 12, 13, 17, 20, 21, 24]

答案 1 :(得分:-1)

我没有关注您的合并代码。这似乎太复杂了。

这是一种合并无限数量的排序数组的方法,每个数组都有不同的大小。

private static int[] mergeSortedArrays(int[]... arrays) {
    int totalLen = 0;
    for (int[] arr : arrays)
        totalLen += arr.length;
    int[] idx = new int[arrays.length];
    int[] merged = new int[totalLen];
    for (int i = 0; i < totalLen; i++) {
        int min = 0, minJ = -1;
        for (int j = 0; j < arrays.length; j++)
            if (idx[j] < arrays[j].length)
                if (minJ == -1 || min > arrays[j][idx[j]]) {
                    min = arrays[j][idx[j]];
                    minJ = j;
                }
        merged[i] = min;
        idx[minJ]++;
    }
    return merged;
}

测试

int[] a = { 3, 5, 9, 13, 17, 21 };
int[] b = { 2, 10, 20 };
int[] c = { 1, 7, 12, 24 };
int[] d = { 6 };
int[] merged = mergeSortedArrays(a, b, c, d);
System.out.println(Arrays.toString(merged));

输出

[1, 2, 3, 5, 6, 7, 9, 10, 12, 13, 17, 20, 21, 24]

答案 2 :(得分:-1)

如果使用类“Integer”而不是原始int不是问题你可以使用它,基本上首先进行合并并在对它们进行排序后:你甚至可以在同一个方法中调用Arrays.sort并将其命名为mergeAndSort,如果你想......

import java.util.Arrays;

public class Main {
    public static Integer[] merge(Integer[]... arrays) {

        int count = 0;
        for (Integer[] array : arrays) {
            count += array.length;
        }

        Integer[] mergedArray = (Integer[]) java.lang.reflect.Array.newInstance(arrays[0][0].getClass(), count);
        int start = 0;
        for (Integer[] array : arrays) {
            System.arraycopy(array, 0, mergedArray, start, array.length);
            start += array.length;
        }
        return mergedArray;
    }

    public static void main(String[] args) {
        Integer[] array1 = {3, 5, 6, 7, 78, 100};
        Integer[] array2 = {5, 6, 7, 8, 9};
        Integer[] array3 = {2, 6, 7};
        Integer[] merged1 = merge(array1, array2);
        Arrays.sort(merged1);
        Integer[] merged2 = merge(array1, array2, array3);
        Arrays.sort(merged2);
        printArray(merged1);
        printArray(merged2);

    }

    public static void printArray(Integer[] x) {
        System.out.println("--ToString--");
        for (Integer var : x) {
            System.out.println(var);
        }
        System.out.println("----");

    }
}