合并排序逻辑错误
Merge Sort Logical Error
我实际上是在做作业,发现了一个关于合并排序的在线代码并对其进行了一些编辑,但它给出了逻辑错误,答案(排序数组)没有显示,而是只显示前 2 个数字正确(有时)但我无法修复它,如果你可以检查我的代码并给我一些想法。
#include<stdio.h>
int arr[20]; // array to be sorted
int main()
{
int n,i;
clrscr();
printf("Enter the size of array\n"); // input the elements
scanf("%d",&n);
printf("Enter the elements:");
for(i=0; i<n; i++)
scanf("%d",&arr[i]);
merge_sort(arr,0,n-1); // sort the array
printf("Sorted array:"); // print sorted array
for(i=0; i<n; i++)
printf("%d",arr[i]);
getch();
return 0;
}
int merge_sort(int arr[],int low,int high)
{
int mid; int i;
if(low<high) {
mid=(low+high)/2;
// Divide and Conquer
merge_sort(arr,low,mid);
merge_sort(arr,mid+1,high);
// Combine
merge(arr,low,mid,high);
}
return 0;
}
int merge(int arr[],int l,int m,int h)
{
int arr1[10],arr2[10]; // Two temporary arrays to
//hold the two arrays to be merged
int n1,n2,i,j,k,z;
i=0,j=0;
for(z=l;z<=m;z++)
{
arr1[i]=arr[z];
i++;
}
for(z=m+1;z<=h;z++)
{
arr2[j]=arr[z];
j++;
}
n1=i;
n2=j;
i=0;
j=0;
for(k=l; k<=h; k++)
{ //process of combining two sorted arrays
if(i<n1 && j<n2)
{
if(arr1[i]<=arr2[j])
{
arr[k]=arr1[i++];
}
else
arr[k]=arr2[j++];
}
else if(i>=n1)
{
arr[k]=arr[j++];
}
else
{
arr[k]=arr[i++];
}
}
return 0;
}
错误部分
else if(i>=n1)
{
arr[k]=arr[j++];
}
else
{
arr[k]=arr[i++];
}
已更正(使用 arr1
和 arr2
而不是 arr
作为作业来源)
else if(i>=n1)
{
arr[k]=arr2[j++];
}
else
{
arr[k]=arr1[i++];
}
我实际上是在做作业,发现了一个关于合并排序的在线代码并对其进行了一些编辑,但它给出了逻辑错误,答案(排序数组)没有显示,而是只显示前 2 个数字正确(有时)但我无法修复它,如果你可以检查我的代码并给我一些想法。
#include<stdio.h>
int arr[20]; // array to be sorted
int main()
{
int n,i;
clrscr();
printf("Enter the size of array\n"); // input the elements
scanf("%d",&n);
printf("Enter the elements:");
for(i=0; i<n; i++)
scanf("%d",&arr[i]);
merge_sort(arr,0,n-1); // sort the array
printf("Sorted array:"); // print sorted array
for(i=0; i<n; i++)
printf("%d",arr[i]);
getch();
return 0;
}
int merge_sort(int arr[],int low,int high)
{
int mid; int i;
if(low<high) {
mid=(low+high)/2;
// Divide and Conquer
merge_sort(arr,low,mid);
merge_sort(arr,mid+1,high);
// Combine
merge(arr,low,mid,high);
}
return 0;
}
int merge(int arr[],int l,int m,int h)
{
int arr1[10],arr2[10]; // Two temporary arrays to
//hold the two arrays to be merged
int n1,n2,i,j,k,z;
i=0,j=0;
for(z=l;z<=m;z++)
{
arr1[i]=arr[z];
i++;
}
for(z=m+1;z<=h;z++)
{
arr2[j]=arr[z];
j++;
}
n1=i;
n2=j;
i=0;
j=0;
for(k=l; k<=h; k++)
{ //process of combining two sorted arrays
if(i<n1 && j<n2)
{
if(arr1[i]<=arr2[j])
{
arr[k]=arr1[i++];
}
else
arr[k]=arr2[j++];
}
else if(i>=n1)
{
arr[k]=arr[j++];
}
else
{
arr[k]=arr[i++];
}
}
return 0;
}
错误部分
else if(i>=n1)
{
arr[k]=arr[j++];
}
else
{
arr[k]=arr[i++];
}
已更正(使用 arr1
和 arr2
而不是 arr
作为作业来源)
else if(i>=n1)
{
arr[k]=arr2[j++];
}
else
{
arr[k]=arr1[i++];
}