码迷,mamicode.com
首页 > 编程语言 > 详细

【算法导论】归并排序

时间:2015-04-21 17:26:08      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!