C++ 随机生成及计量测试时间 算法测试用例

测试选择排序,插入排序,归并排序所花时间,sorttesthelper.h头文件自己写出。

原来参考视频写的东西搬了点过来,求轻虐。

cpp文件:

#include<iostream>
#include<algorithm>
#include<string>
#include"sorttesthelper.h"
using namespace std;


//插入排序 
template<typename T>
void insertionsort(T arr[],int l,int r)
{
	for(int i=l+1;i<=r;i++)
	{
		T e=arr[i];
		int j;
		for(j=i;j>=l&&e<arr[j-1];j--)
		arr[j]=arr[j-1];
		
		arr[j]=e;
	}
	return ;
	
 } 
 

 //选择排序 
template<typename T>
void selectionsort(T arr[],int n)
{
	for(int i=0;i<n;i++)
	{
		int minindex=i;
		for(int j=i+1;j<n;j++)
		if(arr[j]<arr[minindex])
		minindex=j;
		swap(arr[i],arr[minindex]);
		
	}
 } 
 
 //插入排序 
template<typename T>
 void insertsort(T arr[],int n)
 {
 	for(int i=0;i<n;i++)
 	{
	 T e=arr[i];
	 int j;
 	for(j=i;j>0&&arr[j-1]>e;j--)
 	{
 		arr[j]=arr[j-1];
	 }
	 arr[j]=e;
 	
 }
 }
 
 //归并排序 
 template<typename T>
 void merge(T arr[],int l,int mid,int r)
 {
 	T aux[r-l+1];
 	for(int i=l;i<=r;i++)
 	aux[i-l]=arr[i];
 	
 	int j=l;int k=mid+1;
 	for(int i=l;i<=r;i++)
 	{
 		if(k>r)
 		{
 			arr[i]=aux[j-l];
 			j++;
		 }
 		
 		else if(j>mid)
 		{
 			arr[i]=aux[k-l];
 			k++;
		 }
 		
 		else if(aux[j-l]>aux[k-l])
 		{
 			arr[i]=aux[k-l];
 			k++;
		 }
		 else
		 {
		 	arr[i]=aux[j-l];
		 	j++;
		 }
		 
 		
	 }
 	
 }
 
  //自低向上的归并排序,没有用到数组的索引 
 template<typename T>
 void mergesortBU(T arr[],int n)
 {
 	for(int sz=1;sz<=n;sz+=sz)
 	for(int i=0;i+sz<n;i+=sz+sz)
 	merge(arr,i,i+sz-1,min(i+sz+sz-1,n-1));
 }
 
 
 template<typename T>
 void __mergesort(T arr[],int l,int r)
 {
 if(l>=r)
 	return ;
 
 /*if(r-l<=15)
 {
 	insertionsort(arr,l,r);
 	return ;
 }*/
 	
 	int mid=(l+r)/2;
 	__mergesort(arr,l,mid);
 	__mergesort(arr,mid+1,r);
 	
 	if(arr[mid]>arr[mid+1])
 	merge(arr,l,mid,r);
 	
 }
 
 // 
 template<typename T>
 void mergesort(T arr[],int n)
 {
 	__mergesort(arr,0,n-1);
 }
 

 
 int main()
 {
 	int n=10000;
 	int *arr=sorttesthelper::generaterandomarray(n,0,n);
 	int *arr2=sorttesthelper::copyintarray(arr,n);
 	int *arr3=sorttesthelper::copyintarray(arr,n);
 	
 	//selectionsort(arr,n);
 //	sorttesthelper::printarray(arr,n);
 	
sorttesthelper::testsort("选择排序所花时间",selectionsort,arr,n);
sorttesthelper::testsort("插入排序所花时间",insertsort,arr2,n);	
sorttesthelper::testsort("归并排序所花时间",mergesort,arr3,n);	
 	delete[] arr;
 	delete[] arr2;
 	delete[] arr3;
 	
 	return 0;
 }

sorttesthelper.h文件:

#include<iostream>
#include<ctime>
#include<cassert>
#include<algorithm>
using namespace std;
namespace sorttesthelper{
//生成了,有n个元素的随机数组,每个元素范围为(l,r); 
int* generaterandomarray(int n,int rangel,int ranger)
{
	assert(rangel<=ranger);
	
	int *arr=new int[n];
	 srand(time(NULL));
	 for(int i=0;i<n;i++)
	 {
	 	arr[i]=rand()%(ranger-rangel+1)+rangel;
	 }
	 return arr;
}

int* generatenearlyorderdarray(int n,int swapTimes)
{
	int *arr=new int[n];
	for(int i=0;i<n;i++)
	arr[i]=i;
	
	srand(time(NULL));
	for(int i=0;i<swapTimes;i++){
		int posx=rand()%n;
		int posy=rand()%n;
		swap(arr[posx],arr[posy]);
	}
	return arr;
}

template<typename T>
void printarray(T arr[],int n)
{
	
	cout<<"生成"<<n<<"个元素的随机数组:"<<" "; 
	for(int i=0;i<n;i++)
	cout<<arr[i]<<" ";
	
	cout<<endl;
	
	return ;
}

template<typename T>
bool issorted(T arr[],int n)
{
	for(int i=0;i<n-1;i++)
	{
		if(arr[i]>arr[i+1])
		return false;
	}
	
	return true;
}

template<typename T>
void testsort(string sortname,void(*sort)(T[],int),T arr[],int n)
{
	clock_t startTime=clock();
	sort(arr,n);
	
	clock_t endTime=clock();
	assert(issorted(arr,n));
	cout<<sortname<<":"<<double(endTime-startTime)/CLOCKS_PER_SEC<<"s"<<endl;
	
	return ;
}

int* copyintarray(int a[],int n)
{
	int* arr=new int[n];
	copy(a,a+n,arr);
	return arr;
}

} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值