我这里就不对合并排序的思想给予介绍了,感兴趣的朋友可以查阅相关的算法书籍,我就讲讲我在编写程序的过程中遇到的问题以及解决方法。
这是我刚开始写的一个子程序
void _merge(int A[],int p,int q,int r)
{
int n1=q-p+1;
int n2=r-q;
//int* L=new int[n1+1];
//int* R=new int[n2+1];
int L[n1+1];
int R[n2+1];
int i,j;
for(i=0;i<=n1-1;i++)
L[i]=A[p+i];
for(j=0;j<=n2-1;j++)
R[j]=A[q+j+1];
L[n1]=2147483647;
R[n2]=2147483647;
i=0;
j=0;
int k;
for(k=p;k<=r;k++)
{
if(L[i]<=R[j])
{
A[k]=L[i];
i++;
}
else
{
A[k]=R[j];
j++;
}
}
// delete [] L;
// delete [] R;
}
编译结果
意思是说,我们在定义数组时,数组大小必须为常量,因为它是静态分配存储空间的,后来我试图把n1和n2两个变量改为const型,结果仍是编译通不过,无奈之下,我只能采用new,delete进行动态分配的方式定义数组,结果编译0error,0warning
一下为修改过的程序。
void _merge(int A[],int p,int q,int r)
{
int n1=q-p+1;
int n2=r-q;
int* L=new int[n1+1];
int* R=new int[n2+1];
int i,j;
for(i=0;i<=n1-1;i++)
L[i]=A[p+i];
for(j=0;j<=n2-1;j++)
R[j]=A[q+j+1];
L[n1]=2147483647;
R[n2]=2147483647;
i=0;
j=0;
int k;
for(k=p;k<=r;k++)
{
if(L[i]<=R[j])
{
A[k]=L[i];
i++;
}
else
{
A[k]=R[j];
j++;
}
}
delete [] L;
delete [] R;
}
下面为其它的子程序
#include"_Merge.h"
void merge_sort(int A[],int p,int r)
{
int q;
if(p<r)
{
q=(p+r)/2;
merge_sort(A,p,q);
merge_sort(A,q+1,r);
_merge(A,p,q,r);
}
}
#ifndef _MERGE_H
#define _MERGE_H
void _merge(int A[],int p,int q,int r);
#endif
#ifndef _MERGE_SORT_H_
#define MERGE_SORT_H_
void merge_sort(int A[],int p,int r);
#endif
试验主程序
#include<iostream>
#include"_Merge.h"
#include"Merge_Sort.h"
using namespace std;
int main()
{
int A[]={3,41,52,26,38,57,9,49};
merge_sort(A,0,7);
for(int i=0;i<8;i++)
cout<<A[i]<<" ";
cout<<endl;
return 0;
}
试验结果