通过指针合并2个数组

时间:2012-01-08 20:52:35

标签: c++ pointers merge

/*Program to merge to arrays using pointers in descending order, when the first array is in ascending order 

and the second array is in descending order*/

#include<iostream.h>
#include<conio.h>

void merge(int *ptr1, int *ptr2, int m, int n)
{
    int *p=new int[m+n],i,j,k;
    for(i=0,k=m-1;i<(m/2);i++,k--) //to reverse the fir``st array from ascending to descending
    {
       j=*(ptr1+i);
       *(ptr1+i)=*(ptr1+k);
       *(ptr1+k)=j;
    }
    for(i=0,j=0,k=0;i<m&&j<n;)
    {
       if (*(ptr1+i) > *(ptr2+j))
       {
      *(p+k)=*(ptr1+i);
      i++;k++;
       }
       else
       {
          *(p+k)=*(ptr2+j);
      j++;k++;
       }
    }
    if(i==m)
       while(j<n)
       {
          *(p+k)=*(ptr2+j);
          j++;k++;
       }
    else if(j==n)
       while(i<m)
       {
      *(p+k)=*(ptr1+i);
      i++;k++;
       }
    cout<<"\n\n";
    for(i=0;i<k;i++)
       cout<<*(p+i)<<" ";
    getch();
    delete p;
}

void  main()
{
   clrscr();
   int i,j,k,a,b;
   cout<<"\nEnter the size of the first array first array : ";
   cin>>a;
   cout<<"\nEnter the size of second array : ";
   cin>>b;
   int *p1=new int[a], *p2=new int[b];
   cout<<"\nEnter the elements of the first array : ";
   for(i=0;i<a;i++)
      cin>>*(p1+i);
   cout<<"\nEnter the elements of the second array : ";
   for(i=0;i<b;i++)
      cin>>*(p2+i);
   for(i=1;i<a;i++) //insertion sort to sort 1st array in ascending order
   {
      k=*(p1+i);
      for(j=i-1;j>=0&&*(p1+j)>k;j--)
     *(p1+j+1)=*(p1+j);
      *(p1+j+1)=*(p1+j);
   }
   for(i=1;i<b;i++) //insertion sort to sort the 2nd array in descending order
   {
      k=*(p2+i);
      for(j=i-1;j>=0&&*(p2+j)>k;j--)
     *(p2+j+1)=*(p2+j);
      *(p2+j+1)=*(p2+j);
   }
   for(i=0;i<k;i++)
       cout<<*(p1+i)<<" ";
   cout<<endl;
  /* int c[]={3,5,7};
   int d[]={8,6,4};
   merge(c,d,3,3); */ To check
   merge(p1,p2,a,b);
  delete p1;
  delete p2;
}

合并功能工作正常,但我不明白为什么插入排序不能正常工作。有人可以帮忙吗?

我通过使用已排序的静态数组单独检查合并,如代码末尾所示,合并工作正常,但是当我使用动态分配时,代码不起作用。

2 个答案:

答案 0 :(得分:2)

您还应该用delete []替换delete。

答案 1 :(得分:1)

for(j=i-1;j>=0&&*(p1+j)>k;j--)
    *(p1+j+1)=*(p1+j);
*(p1+j+1)=*(p1+j);

最后一行应为

*(p1+j+1)=k

否则你会在循环后获得j == -1之后的一些虚假数据。第二种情况也一样。

此外,您最后打印出的数组是错误的,它应该使用a,而不是k作为上限。

您的合并功能会反转一个阵列,但不反转另一个阵列。要么你必须按降序排序第二个数组(正如评论所说的那样),或者更好的是,删除合并函数开头的反转并按正确的顺序对数组进行排序。

最后,如果您使用描述性变量名称并正确缩进代码,您的代码将更容易阅读(因此也需要调试)。