标签:
一个归并排序卡了一天最后还是归并算法有问题,最初是为了把算法导论的伪代码转到c++而加了一些东西,其中在对左右数组的赋值那里出了问题。因为进行测试时不完全,就是只用书上的数组进行测试时,归并算法部分还好使,而归并排序不好使,一度以为是函数递归出了问题。现在看来,首先要看懂递归模型,然后算法的基础要弄明白,输入的参数一定要弄好,不要总弄常量进行测试。
//MERGE(A,p,q,r)
// n1=q-p+1
// n2=r-q
// let L[1...n1+1] and R[1..n2+1] be new arrays
// for i=1 to n1
// L[i]=A[p+i-1]
// for j=1 to n2
// R[j]=A[q+j]
// L[n1+]=infinity
// R[n2+1]=infinity
// i=1
// j=1
// for k=p to r
// if L[i]<=R[j]
// A[k]=L[i]
// i=i+1
// else A[k]=R[j]
// j=j+1
#include <iostream> using namespace std;
void Merge(int A[],int p,int q,int r)
{ int n1=q-p+1;
int n2=r-q;
int *L=new(int[n1]);
int *R=new(int[n2]);
for (int i=0;i<n1;i++)
{ L[i]=A[i+p-1];//这两个地方不能瞎改,跟归并排序有关,乱改了就会出现归并无法进行的情况。 }
L[n1]=10000;
for (int j=0;j<n2;j++)
{ R[j]=A[q+j];//这两个地方不能瞎改 }
R[n2]=10000;
int i=0;
int j=0;
int k;
for (k=p-1;k<r;k++)
{
if (L[i]<=R[j])
{ A[k]=L[i];
i++; }
else { A[k]=R[j]; j++; }
}
//delete L;
//delete R;//一加这两条程序就死了
}
void MergeSort(int A[],int p,int r)//归并排序
{ if( p < r )
{ int q=(p+r)/2;
MergeSort(A,p,q);
MergeSort(A,q+1,r);
Merge(A,p,q,r); }
}
//MERGE-SORT(A,p,r)
// if q<r
// q=[(p+r/2)]
// MERGE-SORT(A,p,q)
// MERGE-SORT(A,q+1,r)
// MERGE(A,p,q,r)
int main()
{ int A[]={9,8,7,6,5,4,3,2,1,0,6,5,4,3,2};
//int A[]={2,4,5,7,1,2,3,6};
int p,r,q;
p=1;
//q=4;
r=15;
cout<<"排序前:";
for (int i=0;i<r;i++)
cout<<A[i]<<‘ ‘;
cout<<endl;
MergeSort(A,p,r);//归并排序
cout<<"排序后:";
for (int i=0;i<r;i++)
cout<<A[i]<<‘ ‘;
cout<<endl;
system("pause");
return 0; }
标签:
原文地址:http://www.cnblogs.com/fastcam/p/4444553.html