您的位置:首页 > 编程语言 > C语言/C++

C++学习连载—合并排序及其遇到的问题

2013-11-26 15:31 267 查看
我这里就不对合并排序的思想给予介绍了,感兴趣的朋友可以查阅相关的算法书籍,我就讲讲我在编写程序的过程中遇到的问题以及解决方法。

这是我刚开始写的一个子程序

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;

}

试验结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: