【算法】比较快速排序和二路归并排序的平均算法复杂度(C++源码)

【算法】比较快速排序和二路归并排序的平均算法复杂度(C++源码)

一、任务描述

快速排序和二路归并排序的平均算法复杂度为O(nlog2n),请根据自己实现的代码,分别统计n=100000,1000000时上述两个算法的平均运行时间,并根据实验结果回答如下问题:
1)在上述输入规模下,两个算法的平均运行时间是否处在同一数量级?如果不是,请析其可能的原因。
2)应用STL库中的sort算法,在上述输入规模下的平均运行时间多少?是否同你实现的快速排序以及归并排序在平均运行时间上处于同一数量级?

二、步骤描述

运用C++统计代码运行时间计时器进行计时,并每次调整数组大小。
1>两个算法的平均运行时间不处于同一数量级,二分排序的时间会更快。
2>sort算法的运行时间比快速排序和二路归并排序都要快。

三、程序运行结果截图

1
2
3
4

四、源代码-问题一(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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码两年半的练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值