合并函数中的Mergesort动态数组

时间:2013-06-07 13:18:10

标签: c++

如果我左右创建一个静态数组(在合并函数中),这是有效的。但是当我动态创建这些数组时(在合并函数的注释中)它不起作用。我无法找到问题。请帮忙

using namespace std;
#include <iostream>
int *array;
void mergesort(int array[],int,int);                  
void merge(int array[],int,int,int);                  
int main()
{
  int n, start, end;
  cout<<"Enter the no. of elements: ";
  cin>>n;
//  int *array;
  array = new int(n);
  for(int i=0;i<n;i++)
     cin>>array[i];
  start = 0;
  end = n - 1;
  mergesort(array,0,n-1);
  for(int j=0;j<n;j++)
     cout<<array[j];
   return 0;
}
void mergesort(int array[],int start,int end)
{
  int mid;                      
  if(start < end)
  {
     mid = (start + end) /2;
     mergesort(array,start,mid);
     mergesort(array,mid+1,end);
     merge(array,start,mid,end);
   }
}
void merge(int array[],int start,int mid,int end)    
{
  int i,j;
  int n1 = mid - start + 1;
  int n2 = end - mid;
  int left[20];
  int right[20];

    //int *left;
    //int *right;
    //left = new int(n1);
        //right = new int(n2);
  for(i = 0;i < n1;i++)
     left[i] = array[start + i];                
  for(j = 0;j < n2;j++)
     right[j] = array[mid + j + 1];            
  left[i] = 32767;
  right[j] = 32767;

  i = 0;
  j = 0;
  for(int m = start;m <= end;m++)
  {
    if(left[i] <= right[j])
    {
      array[m] = left[i];
      i++;
    }
    else
    {
      array[m] = right[j];
      j++;
    }
  }
}

1 个答案:

答案 0 :(得分:2)

一些错误:

  1. 分配数组的正确方法是:

    left = new int[n1];
    

    而不是left = new int(n1);正如你所做的那样。

  2. 数组大小不正确。您将n1+1leftn2+1项目放在right中(包括最终32767值),但只分配n1和{分别为{1}}个元素。相应地更改分配的大小。

  3. 请务必使用n2delete[] left释放您在末尾分配的内存。