【算法导论C++代码】归并排序

      一个归并排序卡了一天最后还是归并算法有问题,最初是为了把算法导论的伪代码转到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; }

 

 

posted on 2015-04-21 15:48  毛尹航  阅读(261)  评论(0编辑  收藏  举报