测试选择排序,插入排序,归并排序所花时间,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;
}
}