一个归并排序卡了一天最后仍是归并算法有问题,最初是为了把算法导论的伪代码转到c++而加了一些东西,其中在对左右数组的赋值那里出了问题。由于进行测试时不彻底,就是只用书上的数组进行测试时,归并算法部分还好使,而归并排序很差使,一度觉得是函数递归出了问题。如今看来,首先要看懂递归模型,而后算法的基础要弄明白,输入的参数必定要弄好,不要总弄常量进行测试。ios
//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; }