C:Mergesort - 错误是什么?输出错误(重复)

时间:2011-03-20 14:33:54

标签: c mergesort

我在C中写了这个“mergesort”。我认为将元素复制回原始数组是错误的。 有人能帮我吗?

提前多多感谢。

enter code here

 /*************************** Merge sort ********************************/
  #include <stdio.h>

  void merge(int arr[], int start1, int end1, int start2, int end2)
  {
   int temp[100], beg1, beg2, i;

   beg1=start1;
   beg2=start2;
   i=0;

   while((beg1<=end1)&&(beg2<=end2))
   {
     if(arr[beg1]<arr[beg2])
      {
        temp[i++]=arr[beg1++];
      }
     else
      {
        temp[i++]=arr[beg2++];
      }
   }
   if(beg1<end1) {
       while(beg1<=end1) temp[i++]=arr[beg1++];
   }

  if(beg2<end2) {  
       while(beg2<=end2) temp[i++]=arr[beg2++];
  }

  i=0;
  for(beg1=start1; beg1<=end1; beg1++)
  {
      arr[beg1]=temp[i++];
  }
 for(beg1=start2; beg1<=end2; beg1++)
  {
      arr[beg1]=temp[i++];
  }
}

 void mergesort(int arr[], int beg, int end)
 {
   int mid;

   if(beg<end) {
      mid=(beg + end)/2;
      mergesort(arr, beg, mid);
      mergesort(arr, mid+1, end);
      merge(arr, beg, mid, mid+1, end);
   }
 }

 int main()
 {
   int i;
   int arr[]={34, 3, 10, 78, 4, 0, 14};
   mergesort(arr, 0, 6);

   printf("Here are the sorted elements:\n");

   for(i=0; i<6; i++){
      printf("%d\t",arr[i]);
   }
   printf("\n");
 }

Output:
  [root@dhcppc0 sorting]# gcc mergesort.c
  [root@dhcppc0 sorting]# ./a.out

     Here are the sorted elements:
          0       0       3       0       10      10

1 个答案:

答案 0 :(得分:1)

end1end2是有效的索引,所以我认为你不应该在这里有if个语句

if(beg1<end1) {
   while(beg1<=end1) temp[i++]=arr[beg1++];
}

if(beg2<end2) {  
   while(beg2<=end2) temp[i++]=arr[beg2++];
}

如果beg1 == end1会怎样?

如果beg1<end1,则在[beg1,end1]范围内至少有2个数组元素。如果只有一个,你也应该复制它。您应该使用if语句保护循环。将上面显示的代码更改为:

//if(beg1<end1) {
   while(beg1<=end1) temp[i++]=arr[beg1++];
//}

//if(beg2<end2) {  
   while(beg2<=end2) temp[i++]=arr[beg2++];
//}

另一方面,您的排序不稳定。要解决此问题,请更改此条件

if(arr[beg1]<arr[beg2])

if(!(arr[beg2]<arr[beg1]))