合并排序逻辑错误

时间:2015-09-22 06:00:14

标签: c algorithm sorting mergesort

我实际上正在进行分配并找到了一个关于合并排序的在线代码并对其进行了一些编辑,但是它给出了逻辑错误,答案(排序数组)没有显示,而是仅显示前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;
}

1 个答案:

答案 0 :(得分:2)

错误的部分

     else if(i>=n1)
     {
      arr[k]=arr[j++];
     }
     else
     {
     arr[k]=arr[i++];
     }

已更正(使用arr1arr2代替arr作为分配来源)

     else if(i>=n1)
     {
      arr[k]=arr2[j++];
     }
     else
     {
     arr[k]=arr1[i++];
     }