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

任务描述:

生成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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值