我使用动态数组返回垃圾值的C ++中的合并排序代码

时间:2015-03-16 19:19:53

标签: sorting merge garbage

请告诉我为什么这段代码会给出垃圾值 编译得很好,基于Cormen算法实现了这种合并排序 基本上在动态数组中取给定数字。采用两个void函数。一个是通过合并排序合并两个子数组,另一个是递归地将数组拆分为子数组

#include<iostream> 
using namespace std;
void merge(int *A,int p, int q, int r)// a  function to merge two //sub arrays
{
     int n1= q-p+1;
     int n2=r-q;
     int L[n1];
     int R[n2];
     for (int i=0;i<n1;i++)
     {
         L[i]=A[p+i];
     }
         int m=1;
     for(int j=0; j<n2 ;j++)
     {
         R[j]=A[q+m];
         m=m+1;
     }
     int i=0;
     int j=0;
     for(int k=0;k<r;k++)
     {
             if (L[i]<=R[j])
             {
            A[k]=L[i];
             i=i+1;
             }

             else
             {
             A[k]=R[j];
              j=j+1;
              }
 }


        }

void mergesort(int *A,int p,int r)// dividng the sequence to sub arrays
{

     if (p<r)     
         {
                  int q;
                  q=(p+r)/2;
                  mergesort(A,p,q);
                  mergesort(A,(q+1),r);
                  merge(A,p,q,r);

                  }

                   }
int main()
{
   int n;
    cout<<"Enter the number of numbers to be sorted by merge sort"<<endl;
    cin>>n;
    int* a=NULL;
    a=new int[n];
    int temp;

    cout<<"Enter the numbers"<<endl;
    for(int i=0;i<n;i++)
    {
            cin>>temp;
            *(a+i)=temp;// inputting the given numbers into a dynamic array
            }

    cout<<"The given numbers are:"<<endl;
    for(int j=0;j<n;j++)
    cout<<*(a+j)<<" ";

      mergesort(a,0,n-1);

  cout<<"The merged sorted numbers are:"<<endl;
    for(int s=0;s<n;s++)
        cout<<*(a+s)<<" "; 

        delete [] a;
     system("pause"); 
          return 0;
          }

1 个答案:

答案 0 :(得分:0)

你的代码中到处都是错误的。例如:

  • 根据您在main中的使用情况,mergesort应该对索引[0,n-1]的子列表进行排序。

有了这个意思,你在mergesort中的递归说为了对索引[p,r-1]进行排序,你应该先排序[p,q-1]然后排序[q+1,r-1]:你完全忽略索引{ {1}}。

同样地,q感到困惑:一旦你在处理mergeL应该是A[i])时修正拼写错误,就需要A[p+i]作为一个列表和[p,q]作为另一个列表:请注意您复制条目[q,r]两次,并且当您可能不应该复制q时。


要修复代码,您需要准确理清应该处理的所有内容。这不是一个问题,你只需要自己写下明确 正好你所有的函数和循环和东西是什么应该做的。

这些天的典型惯例是半开放的间隔:您通常应该考虑从列表中获取索引r。 ([p,q)[p,q)相同)以下是几个为何首选的例子:

  • [p,q-1]的条目数仅为[p,r)
  • r-p循环遍历for通常是[p,r)(不是for(i=p; i<r; ++i)
  • 将时间间隔<=拆分为多个部分,可为您提供[p,r)[p,q)的时间间隔 - 无需担心记得在地方添加[q,r)

e.g。 1通常设计为从索引merge获取第一个列表,从索引[p,q)获取第二个列表。