首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MergeSort -Recursively

MergeSort -Recursively
EN

Stack Overflow用户
提问于 2022-11-29 07:39:53
回答 2查看 50关注 0票数 -1

如果没有任何软件包的帮助,你会怎么写这个?( mergeSort(int[] A) (接受一个数组的输入)和合并( int[] a、int[] l、int[]r)的布局相同。主要问题是将Arrays.copyOfRange转换为非-package版本的java到此代码。谢谢你回答这个问题。

我的另一个问题是如何在参数中使用3个数组来实现合并函数。

这是我尝试过的代码:

代码语言:javascript
复制
 public static int[] mergeArrays3(int[] a, int[] b, int[] c) {
        
       
        int[] result = new int[a.length + b.length +c.length];

        int i = 0, j = 0, k = 0, l=0;
        while(i<a.length &&j<b.length && l<c.length)

        {
//            if (b[i] < a[j] || b[i] <c[i]) {
//                result[k] = c[i];
//                j++;
//            }
            if (c[i] < b[j] || c[i] <a[i]) {
                    result[k] = c[i];
                    l++;
                }

            if (a[i] < b[j] || a[i] <c[i]) {
                result[k] = a[i];
                i++;
            }
            else {
                result[k] = b[j];
                j++;
            }
            k++;
        }
        while(i<a.length)

        {
            result[k] = a[i];
            i++;
            k++;
        }
        while(j<b.length)

        {
            result[k] = b[j];
            j++;
            k++;
        }

        while(l<c.length)
        {
            result[k]=c[l];
            l++;
            k++;
        }

        return result;

    }

进口java.io.*;

进口java.util.Arrays;

公共类MergeSort {

代码语言:javascript
复制
public static void main(String[] args) throws IOException{
代码语言:javascript
复制
    BufferedReader R = new BufferedReader(new InputStreamReader(System.in));
代码语言:javascript
复制
    int arraySize = Integer.parseInt(R.readLine());
代码语言:javascript
复制
    int[] inputArray = new int[arraySize];
代码语言:javascript
复制
    for (int i = 0; i < arraySize; i++) {
代码语言:javascript
复制
        inputArray[i] = Integer.parseInt(R.readLine());
代码语言:javascript
复制
    }
代码语言:javascript
复制
    mergeSort(inputArray);
代码语言:javascript
复制
    for (int j = 0; j < inputArray.length; j++) {
代码语言:javascript
复制
        System.out.println(inputArray[j]);
代码语言:javascript
复制
    }
代码语言:javascript
复制
}
代码语言:javascript
复制
static void mergeSort(int[] A) {
代码语言:javascript
复制
    if (A.length > 1) {
代码语言:javascript
复制
        int q = A.length/2;

//将leftArray的范围从0到-q更改为0到-(q-1),如何编辑Arrays.copyOfRange以手动生成相同的函数而不使用任何包?

代码语言:javascript
复制
        *int[] leftArray = Arrays.copyOfRange(A, 0, q-1);

//将rightArray的范围从Q到A长度更改为q- to -(A.length-1)

代码语言:javascript
复制
        int[] rightArray = Arrays.copyOfRange(A,q,A.length-1);*
代码语言:javascript
复制
        mergeSort(leftArray);
代码语言:javascript
复制
        mergeSort(rightArray);
代码语言:javascript
复制
        merge(A,leftArray,rightArray);
代码语言:javascript
复制
    }
代码语言:javascript
复制
}
代码语言:javascript
复制
static void merge(int[] a, int[] l, int[] r) {
代码语言:javascript
复制
    int totElem = l.length + r.length;
代码语言:javascript
复制
    //int[] a = new int[totElem];
代码语言:javascript
复制
    int i,li,ri;
代码语言:javascript
复制
    i = li = ri = 0;
代码语言:javascript
复制
    while ( i < totElem) {
代码语言:javascript
复制
        if ((li < l.length) && (ri<r.length)) {
代码语言:javascript
复制
            if (l[li] < r[ri]) {
代码语言:javascript
复制
                a[i] = l[li];
代码语言:javascript
复制
                i++;
代码语言:javascript
复制
                li++;
代码语言:javascript
复制
            }
代码语言:javascript
复制
            else {
代码语言:javascript
复制
                a[i] = r[ri];
代码语言:javascript
复制
                i++;
代码语言:javascript
复制
                ri++;
代码语言:javascript
复制
            }
代码语言:javascript
复制
        }
代码语言:javascript
复制
        else {
代码语言:javascript
复制
            if (li >= l.length) {
代码语言:javascript
复制
                while (ri < r.length) {
代码语言:javascript
复制
                    a[i] = r[ri];
代码语言:javascript
复制
                    i++;
代码语言:javascript
复制
                    ri++;
代码语言:javascript
复制
                }
代码语言:javascript
复制
            }
代码语言:javascript
复制
            if (ri >= r.length) {
代码语言:javascript
复制
                while (li < l.length) {
代码语言:javascript
复制
                    a[i] = l[li];
代码语言:javascript
复制
                    li++;
代码语言:javascript
复制
                    i++;
代码语言:javascript
复制
                }
代码语言:javascript
复制
            }
代码语言:javascript
复制
        }
代码语言:javascript
复制
    }
代码语言:javascript
复制
    //return a;
代码语言:javascript
复制
}
代码语言:javascript
复制
}

```javascript
代码语言:javascript
复制
EN

回答 2

Stack Overflow用户

发布于 2022-11-29 08:04:40

这种方法不像Arrays.copyOfRange那样快,也不包括所有的情况,如负索引,也有必要检查大小。

代码语言:javascript
复制
private static int[] copyArray(int[] original, int from, int to) {
  int [] res = new int[to-from];
  for (int i = from; i< to; i++) {
    res[i - from] = original[i];
  }
  return res;
}
票数 0
EN

Stack Overflow用户

发布于 2022-11-29 21:57:50

为一次数组复制和交替参数进行自顶向下的合并排序和for循环,以改变合并的方向和每个递归级别。MergeSort是一个条目函数,它分配并复制到第二个数组。MergeSortR是递归函数。除非所有3个子数组至少有一个元素,否则永远不会调用合并。合并中的嵌套的if \ The只需要2比较来确定最小的元素,但是使用重复的代码来处理aa2是最小元素的情况。(使用C|C++,可以使用goto的代码避免重复代码)。bb是开始索引,ee是结束索引。

代码语言:javascript
复制
    static void MergeSort(int[] a)
    {
        if(a.length < 2)                // if < 2 elements, nothing to sort
            return;
        int [] b = new int[a.length];   // b[] = a[] | int[]b = a.clone();
        for(int i = 0; i < a.length; i++)
            b[i] = a[i];
        MergeSortR(b, a, 0, a.length);  // sort b[] to a[]
    }

    static void MergeSortR(int[] b, int[] a, int bb, int ee)
    {
        if(ee - bb < 2)                 // if < 2 elements, nothing to sort
            return;
        if(ee - bb == 2){               // if 2 elements
            if(a[bb] > a[bb+1]){
                int t = a[bb];
                a[bb] = a[bb+1];
                a[bb+1] = t;
            }
            return;
        }
        int m1 = bb+(ee+0-bb)/3;        // split into 3 parts
        int m2 = m1+(ee+1-bb)/3;
        MergeSortR(a, b, bb, m1);       // sort a[] to b[]
        MergeSortR(a, b, m1, m2);
        MergeSortR(a, b, m2, ee);
        Merge(b, a, bb, m1, m2, ee);    // merge b[] to a[]
    }
    
    static void Merge(int[] a, int[] b, int bb, int m1, int m2, int ee)
    {
        int b0 = bb;                    // b[] index
        int a0 = bb;                    // a[] indexes
        int a1 = m1;
        int a2 = m2;
        while(true){                    // 3 way merge
            if(a[a0] <= a[a1]){
                if(a[a0] <= a[a2]){
                    b[b0] = a[a0];      // a[a0] smallest
                    b0++;
                    a0++;
                    if(a0 < m1)         //  if not end of run
                        continue;       //   continue
                    a0 = a1;            //  else setup for 2 way merge
                    a1 = a2;
                    m1 = m2;
                    m2 = ee;
                    break;
                } else {
                    b[b0] = a[a2];      // a[a2] smallest
                    b0++;
                    a2++;
                    if(a2 < ee)         //  if not end of run
                        continue;       //   continue
                    break;              //  else setup for 2 way merge
                }
            } else {
                if(a[a1] <= a[a2]){
                    b[b0] = a[a1];     // a[a1] smallest
                    b0++;
                    a1++;
                    if(a1 < m2)         //  if not end of run
                        continue;       //   continue
                    a1 = a2;            //  else setup for 2 way merge
                    m2 = ee;
                    break;
                } else {
                    b[b0] = a[a2];      // a[a2] smallest
                    b0++;
                    a2++;
                    if(a2 < ee)         //  if not end of run
                        continue;       //   continue
                    break;              //  else setup for 2 way merge
                }
            }
        }    
        while(true){                    // 2 way merge
            if(a[a0] <= a[a1]){
                b[b0] = a[a0];
                b0++;
                a0++;
                if(a0 < m1)             //  if not end of run
                    continue;           //   continue
                a0 = a1;                //  else setup for copy
                m1 = m2;
                break;
            }else{
                b[b0] = a[a1];
                b0++;
                a1++;
                if(a1 < m2)             //  if not end of run
                    continue;           //   continue
                break;                  //  else setup for copy
            }
        }
        while(true){                    // copy rest of remaining run
            b[b0] = a[a0];
            b0++;
            a0++;
            if(a0 < m1)
                continue;
            break;
        }
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74610565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档