我這裏就不對合並排序的思想給予介紹了,感興趣的朋友可以查閱相關的算法書籍,我就講講我在編寫程序的過程中遇到的問題以及解決方法。
這是我剛開始寫的一個子程序
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;
}
試驗結果