java - 归并排序问题参数

标签 java mergesort

import java.lang.reflect.Array; 

public class Sorting {
public static void mergeSort(CompareInt[] arr) {

   for(int i=0;i<=arr.length-1;i++){
        System.out.println("Initial Arr element:"+arr[i].val);
        } 
    CompareInt[] arrAux;
    arrAux = new CompareInt[arr.length];
    mergeS(arr,0,arr.length-1,arrAux);       
}

public static void mergeS(CompareInt[] arr,int startI,int endI,CompareInt[] arrAux){
    //System.out.println("StartIndex:"+startI+" EndIndex:"+endI);
    if(endI-startI<=0)
        return;

    int mid = (startI+endI)/2;
   // System.out.println("Midpoint value:"+mid);

    mergeS(arr,startI,mid);
    mergeS(arr,mid+1,endI);

  //  System.out.println("Inside mergeS");
  //  System.out.println("StartIndex:"+startI+" EndIndex:"+endI+" Midpoint value:"+mid);
 //   System.out.println("Arr length:"+arr.length);

    arrAux = merge(arr,mid);

    for(int i=0;i<=arr.length-1;i++){
        arr[i]=arrAux[i];
        System.out.println("Arr element:"+arr[i].val);
        }
}


public static CompareInt[] merge(CompareInt[] arr,int midpoint){
int i=0,j=0,k=0;
int n1 = arr.length-midpoint;
int n2 = arr.length-n1;

//System.out.println("Midpoint value inside merge:"+midpoint);
//System.out.println("N1:"+n1+" N2:"+n2);

CompareInt[] L;
CompareInt[] R;
CompareInt[] resA;
L = new CompareInt[n1];
R = new CompareInt[n2];
resA = new CompareInt[n1+n2];


for(i=0;i<n1;i++){
    L[i]=arr[i];
  // System.out.println("Inside Left loop"+i);
  // System.out.println(L[i].val);
    }

for(j=0;j<n2;j++){
    R[j]=arr[midpoint+j+1];
   // System.out.println("Inside Right loop "+j);
   // System.out.println(R[j].val);
}

i=0;
j=0;
k=0;

while(i<n1 && j<n2){
    if(L[i].compareTo(R[j])<=0){
        resA[k]=L[i];
       // System.out.println(resA[i].val);
        i++;
    }
    else{
        resA[k]=R[j];
       // System.out.println(resA[j].val);
        j++;
    }
    k++;
}

while(i<n1){
    resA[k]=L[i];
    //System.out.println(resA[k].val);
    i++;
    k++;
}

while(j<n2){
    resA[k]=R[j];
    //System.out.println(resA[k].val);
    j++;
    k++;
}

 return resA;  
}
}

我在 mereS(..) 行得到的实际参数列表和正式参数列表的长度不同 如何解决此错误?是否有任何方法可以在实际参数和形式参数中使用不同数量的参数运行。

这就是Pseudo code给出 .. 伪代码修改: if (hi - lo <= 0)”,而不是“if (hi - lo <= 1)”。 aux <- 合并(A[lo:mid], A[mid+1:hi])

最佳答案

此代码将解决您的问题:

public static void main(String[] args) {

    int arr[] = {12, 11, 13, 5, 6, 7};

    System.out.println("\nSorted array");
    for(int i=0;i<=arr.length-1;i++){
        System.out.println("Initial Arr element:"+arr[i]);
    }

    mergeS(arr, 0, arr.length-1);

    System.out.println("\nSorted array");
    for(int i=0;i<=arr.length-1;i++){
        System.out.println("Sorted Arr element:"+arr[i]);
    }
}


public static void mergeS(int[] arr,int startI,int endI){
    //System.out.println("StartIndex:"+startI+" EndIndex:"+endI)

    if (startI< endI)
    {
        // Find the middle point
        int m = (startI+endI)/2;

        // Sort first and second halves
        mergeS(arr,startI, m);
        mergeS(arr , m+1, endI);

        // Merge the sorted halves
        merge(arr, startI,m, endI);
    }
}


public static void merge(int arr[], int startI, int midpoint, int endI){
    // Find sizes of two subarrays to be merged
    int n1 = midpoint - startI + 1;
    int n2 = endI - midpoint;

    /* Create temp arrays */
    int L[] = new int [n1];
    int R[] = new int [n2];

    /*Copy data to temp arrays*/
    for (int i=0; i<n1; ++i)
        L[i] = arr[startI + i];
    for (int j=0; j<n2; ++j)
        R[j] = arr[midpoint + 1+ j];


    /* Merge the temp arrays */

    // Initial indexes of first and second subarrays
    int i = 0, j = 0;

    // Initial index of merged subarry array
    int k = startI;
    while (i < n1 && j < n2)
    {
        if (L[i] <= R[j])
        {
            arr[k] = L[i];
            i++;
        }
        else
        {
            arr[k] = R[j];
            j++;
        }
        k++;
    }

    /* Copy remaining elements of L[] if any */
    while (i < n1)
    {
        arr[k] = L[i];
        i++;
        k++;
    }

    /* Copy remaining elements of R[] if any */
    while (j < n2)
    {
        arr[k] = R[j];
        j++;
        k++;
    }
}

关于java - 归并排序问题参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61569883/

相关文章:

java - 在 Windows 任务栏中创建多个图标

java - 了解 Java 中的注解处理

java - 用java处理 future 的日期

python - 使用 Python 进行合并排序

algorithm - 为什么基数排序是 O(nd) 而归并排序不是 O(d*nlogn)?

c - 带线程的并行合并排序/比 Seq 慢很多/慢。归并排序。帮助

Java从科学记数法转换为浮点型

algorithm - 如果我们将合并排序中的数组拆分为 4 个部分会怎样?还是八个部分?

Java 递归和归并排序

java - Java 最好的模拟框架是什么?