【算法导论实验1】插入排序与归并排序

来源:互联网 发布:男性特点知乎 编辑:程序博客网 时间:2024/05/22 13:02

任务描述:

生成50000个随机数,存于input.txt中,然后通过插入排序和归并排序,分别输出到OutputInsertion.txt和OutputMerge.txt中,并统计运行时间。来体会算法的时间复杂度。

代码如下:

//编译环境:GCC 3.4.5,Ubuntu 12.04 LTS//2014.3.26#include <iostream>#include <fstream>#include <algorithm>#include <ctime>#include <iomanip>#include <cstring>using namespace std;const int MaxArraySize=50002;const int maxint=0x3f3f3f3f;int origin[MaxArraySize];int origin2[MaxArraySize];void InsertionSort(int n,int a[]){int key,i;for(int j=1;j<n;j++){key=a[j];i=j-1;while(i>=0 && a[i]>key){a[i+1]=a[i];i--;}a[i+1]=key;}}void Merge(int A[],int p,int q,int r){int len_left=q-p+1;int len_right=r-q;int *L=new int [MaxArraySize];int *R=new int [MaxArraySize];for(int i=0;i<len_left;i++){L[i]=A[p+i];}for(int j=0;j<len_right;j++){R[j]=A[q+j+1];}L[len_left]=maxint;R[len_right]=maxint;int i=0,j=0;for(int k=p;k<=r;k++){if (L[i]<=R[j]){A[k]=L[i];i++;}else{A[k]=R[j];j++;}}}void MergeSort(int A[],int p,int r){int q;if(p<r){q=(p+r)/2;MergeSort(A,p,q);MergeSort(A,q+1,r);Merge(A,p,q,r);}}int main(){//int a[]={8,1,4,6,5,2};//InsertionSort(6,a);ifstream cin;ofstream cout;//生成1000000以内的整数,50000个cout.open("input.txt");srand((unsigned)time(NULL));double cost_time;double starttime,endtime;for(int i=0;i<=50000;i++){    cout<<rand()%(1000000)<<" ";}cout.close();    cin.open("input.txt");    for(int i=0;i<=50000;i++)    {        cin>>origin[i];    }    memcpy(origin2,origin,sizeof(origin));    cin.close();    cout.open("OutputInsection.txt");    starttime=(double)clock();    InsertionSort(50000,origin);    for(int i=0;i<=50000;i++)    {        cout<<origin[i]<<" ";    }    cout<<endl;    endtime=(double)clock();    cost_time=(endtime-starttime);    //输出小数点后3位,单位为秒    cout<<setiosflags(ios::fixed)<<setprecision(6)<<"插入排序花费了:"<<cost_time/1000000<<endl;    cout.close();    cout.open("OutputMerge.txt");    starttime=(double)clock();    MergeSort(origin2,0,50000);    for(int i=0;i<=50000;i++)    {        cout<<origin2[i]<<" ";    }    cout<<endl;    endtime=(double)clock();    cost_time=(endtime-starttime);    //输出小数点后3位,单位为秒    cout<<setiosflags(ios::fixed)<<setprecision(3)<<"归并排序花费了:"<<cost_time/1000000<<endl;    cout.close();return 0;}

如果你用的是VS2008/2010的话,需要将Merge函数里定义的L和R数组变成全局变量。否则会报错。

然后在函数里加入清零语句:

memset(L,0,sizeof(L));

memset(R,0,sizeof(R));


1 0
原创粉丝点击