【算法】比较快速排序和二路归并排序的平均算法复杂度(C++源码)
一、任务描述
快速排序和二路归并排序的平均算法复杂度为O(nlog2n),请根据自己实现的代码,分别统计n=100000,1000000时上述两个算法的平均运行时间,并根据实验结果回答如下问题:
1)在上述输入规模下,两个算法的平均运行时间是否处在同一数量级?如果不是,请析其可能的原因。
2)应用STL库中的sort算法,在上述输入规模下的平均运行时间多少?是否同你实现的快速排序以及归并排序在平均运行时间上处于同一数量级?
二、步骤描述
运用C++统计代码运行时间计时器进行计时,并每次调整数组大小。
1>两个算法的平均运行时间不处于同一数量级,二分排序的时间会更快。
2>sort算法的运行时间比快速排序和二路归并排序都要快。
三、程序运行结果截图
四、源代码-问题一(C++)
#include <iostream>
#include <cmath>
#include <cstring>
#include <windows.h>
#include <ctime>
using namespace std;
int a[101];
int Quicksort(int left, int right)
{
int i,j,t,temp;
if(left>right)
{
return 0;
}
temp=a[left];
i=left;
j=right;
while(i!=j)
{
while(a[j]<=temp&&i<j)
{
j--;
}
while(a[i]>=temp&&i<j)
{
i++;
}
if(i<j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[left] = a[i];
a[i] = temp;
Quicksort(left,i-1);
Quicksort(i+1,right);
return 0;
}
int main()
{
int i,s1,s2;
DWORD start, stop;
unsigned int t = 0;
start = GetTickCount();
cout<<"Please put the number s1:";
cin>>s1;
srand(time(NULL));
int n = 100000;
for(i=1;i<=n;i++)
{
a[i]=rand()%101*1000;
}
Quicksort(1,n);
cout<<"Please put the number s2:";
cin>>s2;
while (t++ < 10e+8);
stop = GetTickCount();
cout<<"The time is:"<<stop - start<<endl;
return 0;
}
五、源代码-问题二(C++)
#include <iostream>
#include <vector>
#include <cmath>
#include <cstring>
#include <windows.h>
#include <ctime>
using namespace std;
void merge(vector<int>&a,vector<int>&b,int l,int r,int m)
{
int i,j,id1,id2;
for(j=l;j<=r;j++)
{
b[j]=a[j];
id1=l;
}
i=1;
id2=m+1;
while(id1<=m&&id2<=r)
{
if(b[id1]<=b[id2])
{
a[i++]=b[id1++];
}
else a[i++]=b[id2++];
}
while(id1<=m)
{
a[i++]=b[id1++];
}
while(id2<=r)
{
a[i++]=b[id2++];
}
}
void mergesort(vector<int>&a,vector<int>&b,int l,int r)
{
int m;
if(l<r)
{
m=(l+r)/2;
mergesort(a,b,l,m);
mergesort(a,b,m+1,r);
merge(a,b,l,r,m);
}
}
int main()
{
int i,n;
srand(time(NULL));
DWORD start, stop;
unsigned int t = 0;
start = GetTickCount();
n=10000000;
vector<int>a(n);
vector<int>b(n);
for(i=0;i<n;i++)
{
a[i]=rand()%101*1000;
}
mergesort(a,b,0,n-1);
while (t++ < 10e+6);
stop = GetTickCount();
cout<<"The time is:"<<stop - start;
return 0;
}