Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 合并在C中排序和删除重复项(任何语言都可以)_Java_C++_C_Duplicates_Mergesort - Fatal编程技术网

Java 合并在C中排序和删除重复项(任何语言都可以)

Java 合并在C中排序和删除重复项(任何语言都可以),java,c++,c,duplicates,mergesort,Java,C++,C,Duplicates,Mergesort,这是我的第一个问题,所以如果我遗漏了任何内容或对某个项目有歧义,我会提前道歉 无论如何,这是我从geeksforgeks.org(为了提问而修改数组)获得的代码,但概念是一样的:我需要如何修改提供的mergesort代码,以便在排序时删除重复项。 我想我可以改变: if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; if(L[i]R[j]) { arr[k]

这是我的第一个问题,所以如果我遗漏了任何内容或对某个项目有歧义,我会提前道歉

无论如何,这是我从geeksforgeks.org(为了提问而修改数组)获得的代码,但概念是一样的:我需要如何修改提供的mergesort代码,以便在排序时删除重复项。 我想我可以改变:

if (L[i] <= R[j])
{
    arr[k] = L[i];
    i++;
}
else
{
    arr[k] = R[j];
    j++;
}
k++;
if(L[i]R[j])
{
arr[k]=R[j];
j++;
}
其他的
{
arr[k]=L[i];
i++;
j++;
}
k++;
但它将被排序的数组丢弃了。是的,它们必须在排序时删除,而不是在其他步骤中删除。 以下是承诺的代码:

int shift = 0;
int merge(int arr[], int l, int m, int r)
{
int i, j, k;
int n1 = m - l + 1;
int n2 =  r - m;

/* create temp arrays */
int L[n1], R[n2];

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

/* Merge the temp arrays back into arr[l..r]*/
i = 0; // Initial index of first subarray
j = 0; // Initial index of second subarray
k = l; // Initial index of merged subarray
while (i < n1 && j < n2)
{
    if (L[i] <  R[j])
    {
        arr[k] = L[i];
        i++;
    }
    else if (L[i] >  R[j])
    {
        arr[k] = R[j];
        j++;
    }
    else
    {
        arr[k] = L[i];
        i++;
        j++;
        shift++;
    }
    k++;
} 
    /* Copy the remaining elements of L[], if there
   are any */
while (i < n1)
{
    arr[k] = L[i];
    i++;
    k++;
}

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

/* l is for left index and r is right index of the
sub-array of arr to be sorted */
void mergeSort(int arr[], int l, int r)
{
if (l < r)
{
    // Same as (l+r)/2, but avoids overflow for
    // large l and h
    int m = l+(r-l)/2;

    // Sort first and second halves
    mergeSort(arr, l, m);
    mergeSort(arr, m+1, r);

    merge(arr, l, m, r);
}
}

/* UTILITY FUNCTIONS */
/* Function to print an array */
void printArray(int A[], int size)
{
int i;
for (i=0; i < size; i++)
    printf("%d ", A[i]);
printf("\n");
}

/* Driver program to test above functions */
int main()
{
int arr[] = {4,5,7,2,7,0,1,2,4,7,3,4,7,5,6};
int arr_size = sizeof(arr)/sizeof(arr[0]);

printf("Given array is \n");
printArray(arr, arr_size);

mergeSort(arr, 0, arr_size - 1);

printf("\nSorted array is \n");
printArray(arr, arr_size);
return 0;
}
intshift=0;
整数合并(整数arr[],整数l,整数m,整数r)
{
int i,j,k;
int n1=m-l+1;
int n2=r-m;
/*创建临时阵列*/
int L[n1],R[n2];
/*将数据复制到临时数组L[]和R[]*/
对于(i=0;iR[j])
{
arr[k]=R[j];
j++;
}
其他的
{
arr[k]=L[i];
i++;
j++;
shift++;
}
k++;
} 
/*复制L[]的其余元素(如果有)
有吗*/
而(i

谢谢大家!

缩减大小的合并段必须以某种方式将其结果大小传送回递归链。这是你想要完成的任务的关键。您的
merge
函数当前的
void
结果似乎是一个非常方便的开始。@WhozCraig感谢您的回复!我创建了一个全局变量(intshift=0),每当它在merge函数中找到一个重复的变量时,它就会向shift添加一个,并在最后返回值。这就是我被困的地方,因为我不知道该怎么办。递归很难让我的大脑思考。
int shift = 0;
int merge(int arr[], int l, int m, int r)
{
int i, j, k;
int n1 = m - l + 1;
int n2 =  r - m;

/* create temp arrays */
int L[n1], R[n2];

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

/* Merge the temp arrays back into arr[l..r]*/
i = 0; // Initial index of first subarray
j = 0; // Initial index of second subarray
k = l; // Initial index of merged subarray
while (i < n1 && j < n2)
{
    if (L[i] <  R[j])
    {
        arr[k] = L[i];
        i++;
    }
    else if (L[i] >  R[j])
    {
        arr[k] = R[j];
        j++;
    }
    else
    {
        arr[k] = L[i];
        i++;
        j++;
        shift++;
    }
    k++;
} 
    /* Copy the remaining elements of L[], if there
   are any */
while (i < n1)
{
    arr[k] = L[i];
    i++;
    k++;
}

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

/* l is for left index and r is right index of the
sub-array of arr to be sorted */
void mergeSort(int arr[], int l, int r)
{
if (l < r)
{
    // Same as (l+r)/2, but avoids overflow for
    // large l and h
    int m = l+(r-l)/2;

    // Sort first and second halves
    mergeSort(arr, l, m);
    mergeSort(arr, m+1, r);

    merge(arr, l, m, r);
}
}

/* UTILITY FUNCTIONS */
/* Function to print an array */
void printArray(int A[], int size)
{
int i;
for (i=0; i < size; i++)
    printf("%d ", A[i]);
printf("\n");
}

/* Driver program to test above functions */
int main()
{
int arr[] = {4,5,7,2,7,0,1,2,4,7,3,4,7,5,6};
int arr_size = sizeof(arr)/sizeof(arr[0]);

printf("Given array is \n");
printArray(arr, arr_size);

mergeSort(arr, 0, arr_size - 1);

printf("\nSorted array is \n");
printArray(arr, arr_size);
return 0;
}