(原创)各种排序算法性能分析

beef9999 2011-12-22 09:43:44

// Beef @ USTC. All rights reserved.
// beef9999@qq.com
// 2011.12.22
// 五种排序算法的性能分析
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <iterator>
#include <time.h>
#include "CalTime.h"
using namespace std;

typedef vector<double> VoD;

int _tmain(int argc, _TCHAR* argv[])
{
Time *p;
p=new InsertionTime;
cout<<MAXIMUM<<"个随机数的插入排序消耗时间为"<<p->cal_time()<<"秒"<<endl;
p=new MergeTime;
cout<<MAXIMUM<<"个随机数的合并排序消耗时间为"<<p->cal_time()<<"秒"<<endl;
p=new QuickTime;
cout<<MAXIMUM<<"个随机数的快速排序消耗时间为"<<p->cal_time()<<"秒"<<endl;
p=new BubbleTime;
cout<<MAXIMUM<<"个随机数的冒泡排序消耗时间为"<<p->cal_time()<<"秒"<<endl;
p=new BucketTime;
cout<<MAXIMUM<<"个随机数的桶排序("<<BUCKET_NUM<<"个桶)消耗时间为"<<p->cal_time()<<"秒"<<endl;
return 0;
}


// Beef @ USTC. All rights reserved.
// beef9999@qq.com
// 2011.12.22
#ifndef CALTIME_H
#define CALTIME_H
//////////////////////////////////////////////////////////////////////////
#include <vector>
#include <time.h>
#define MAXIMUM 1000
#define BUCKET_NUM 100
using std::vector;
typedef vector<double> VoD;
/*
时间 基类
*/
class Time
{
public:
Time();
double cal_time(); //每个派生类都调用该函数计算时间
virtual void each_sort(){} //针对每个算法的虚函数
void initArray();
protected:
VoD m_A;
clock_t start,finish;
};
/*
插入排序
*/
class InsertionTime: public Time
{
public:
virtual void each_sort();
protected:
void insertion_sort(VoD &A);
};
/*
合并排序
*/
class MergeTime:public Time
{
public:
virtual void each_sort();
private:
void merge_sort(VoD &A,int p,int r);
void merge(VoD &A,int p,int q,int r);
};
/*
快速排序
*/
class QuickTime:public Time
{
public:
virtual void each_sort();
private:
void quick_sort(VoD &A,int p,int r);
int partition(VoD &A,int p,int r);
};
/*
冒泡排序
*/
class BubbleTime:public Time
{
public:
virtual void each_sort();
private:
void bubble_sort(VoD &A);
};
/*
桶排序
*/
class BucketTime:public InsertionTime
{
public:
virtual void each_sort();
private:
void bucket_sort(VoD &A);
};
//////////////////////////////////////////////////////////////////////////
#endif

...全文
274 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamnobody 2011-12-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oxwuag 的回复:]
空杯理论。。。
[/Quote]

楼主写了这么多代码是精神可嘉的.
而且背理论也是必须的.是前提.

但是算法导论上应该有说明这些排序算法的复杂度,没有必要进行所谓的测试,就像之前老是写一些JAVA和C++的代码来说明JAVA比C++快的行为那样...

楼主说的每个算法都有他们擅长的数据环境,这种测试是没有意义的..

你比较一下在大数据量的情况下,你写的算法的速度和std::sort的速度就知道一种单纯的排序算法是多么的有限了..


oxwuag 2011-12-24
  • 打赏
  • 举报
回复
空杯理论。。。
beef9999 2011-12-23
  • 打赏
  • 举报
回复
插入、合并、快速、冒泡、桶排序性能分析
每一句都是最标准的C++代码,充分运用面向对象的设计理念,整体结构紧凑富有逻辑性。
具体算法严格参照《算法导论》第四版
vs2010下可以正常运行
其他环境下,请自行建立工程,并拷贝sorts目录下sorts.cpp CalTime.h CalTime.cpp的内容
oxwuag 2011-12-23
  • 打赏
  • 举报
回复
1.C++少用define,多用const
2.不推荐用vector实现排序,vector的operator[]等函数调用入栈出栈的需要时间,影响性能
3.桶排序用的是插入排序,注释错了 :)
4.作为一个完整的程序来讲,new的对象,要对其释放
5.构造函数,最佳写法是member initialization list形式
beef9999 2011-12-22
  • 打赏
  • 举报
回复

#include "StdAfx.h"
#include "CalTime.h"
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////////////////////////
Time::Time()
{
initArray();
}
void Time::initArray()
{
m_A.reserve(MAXIMUM);
for (int i=0;i!=MAXIMUM;++i)
m_A.push_back(rand()/double(RAND_MAX));
}
double Time::cal_time()
{
start=clock();
each_sort();
finish=clock();
double total=(finish-start)/double(CLOCKS_PER_SEC);
return total;
}
//////////////////////////////////////////////////////////////////////////
void InsertionTime::insertion_sort(VoD &A)
{
for (int j=1;j!=A.size();++j)
{
double key=A[j];
int i=j-1;
while (i>=0&&A[i]>key)
{
A[i+1]=A[i];
--i;
}
A[i+1]=key;
}
}
void InsertionTime::each_sort()
{
insertion_sort(m_A);
}
//////////////////////////////////////////////////////////////////////////
void MergeTime::merge_sort(VoD &A,int p,int r)
{
if (p<r)
{
int q=(p+r)/2; //默认取整
merge_sort(A,p,q);
merge_sort(A,q+1,r);
merge(A,p,q,r);
}
}
void MergeTime::merge(VoD &A,int p,int q,int r)
{
int n1=q-p+1;
int n2=r-q;
int i,j;
VoD leftArray,rightArray;
for(i=0;i!=n1;++i)
leftArray.push_back(A[p+i]);
for(j=0;j!=n2;++j)
rightArray.push_back(A[q+j+1]);
leftArray.push_back(MAXIMUM+1);
rightArray.push_back(MAXIMUM+1);
i=j=0;
for(int k=p;k!=r+1;++k)
{
if(leftArray[i]<=rightArray[j])
{
A[k] = leftArray[i];
++i;
}
else
{
A[k] = rightArray[j];
++j;
}
}
}
void MergeTime::each_sort()
{
merge_sort(m_A,0,m_A.size()-1);
}
//////////////////////////////////////////////////////////////////////////
void QuickTime::quick_sort(VoD &A,int p,int r)
{
int q=0;
if(p<r)
{
q=partition(A,p,r);
quick_sort(A,p,q-1);
quick_sort(A,q+1,r);
}
}
int QuickTime::partition(VoD &A,int p,int r)
{
double x=A[r];
double temp=0;
int i=p-1;
for(int j=p;j!=r;++j)
{
if(A[j]<=x)
{
++i;
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
temp=A[i+1];
A[i+1]=A[r];
A[r]=temp;
return i+1;
}
void QuickTime::each_sort()
{
quick_sort(m_A,0,m_A.size()-1);
}
//////////////////////////////////////////////////////////////////////////
void BubbleTime::bubble_sort(VoD &A)
{
double temp=0;
int i,j;
for(i=0;i!=A.size()-1;++i)
{
for(j=0;j!=A.size()-i-1;++j)
{
if(A[j]>A[j+1])
{
temp=A[j];
A[j]=A[j+1];
A[j+1]=temp;
}
}
}
}
void BubbleTime::each_sort()
{
bubble_sort(m_A);
}
//////////////////////////////////////////////////////////////////////////
void BucketTime::bucket_sort(VoD &A)
{
vector<VoD> B(BUCKET_NUM,0);
for (int i=0;i!=A.size();++i) //放入桶中
{
int var=static_cast<int>(BUCKET_NUM*A[i]/1);
B[var].push_back(A[i]);
}
A.clear();
for (int i=0;i!=B.size();++i)
{
if (B[i].empty())
continue;
insertion_sort(B[i]); //对每个桶调用快速排序
for (VoD::const_iterator iter=B[i].begin();iter!=B[i].end();++iter)
A.push_back(*iter); //将排序好的桶里的链表重新加入A
}
}
void BucketTime::each_sort()
{
bucket_sort(m_A);
}
一、本书的内容 目前,市面上有关计算机算法的书很多,有些叙述严谨但不全面,另外一些则是容量很大但不够严谨。本书将叙述的严谨性以及内容的深度和广度有机地结合了起来。第1版推出后,即在世界范围内受到了广泛的欢迎,被各高等院校用作多种课程的教材和业界的标准参考资料。它深入浅出地介绍了大量的算法及相关的数据结构,以及用于解决一些复杂计算问题的高级策略(如动态规划、贪心算法、平摊分析等),重点在于算法的分析和设计。对于每一个专题,作者都试图提供目前最新的研究成果及样例解答,并通过清晰的图示来说明算法的执行过程。. 本书是原书的第2版,在第1版的基础之上增加了一些新的内容,涉及算法的作用、概率分析和随机化算法、线性规划,以及对第1版中详尽的、几乎涉及到每一小节的修订。这些修订看似细微,实际上非常重要。书中引入了“循环不变式”,并贯穿始终地用来证明算法的正确性。在不改动数学和分析重点的前提下,作者将第1版中的许多数学基础知识从第一部分移到了附录中。 二、本书的特点 本书在进行算法分析的过程中,保持了很好的数学严谨性。书中的分析和设计可以被具有各种水平的读者所理解。相对来说,每一章都可以作为一个相对独立的单元来教授或学习。书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如人类基因项目)、商业和工程等领域。每一小节通常以对相关历史素材的讨论结束,讨论了在每一算法领域的原创研究。 本书的特点可以概括为以下几个方面: 1.概念清晰,广度、深度兼顾。 本书收集了现代计算机常用的数据结构和算法,并作了系统而深入的介绍。对涉及的概念和背景知识都作了清晰的阐述,有关的定理给出了完整的证明。 2.“五个一”的描述方法。 本书以相当的深度介绍了许多常用的数据结构和有效的算法。编写上采用了“五个一”,即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。.. 3.图文并茂,可读性强。 书中的算法均以通俗易懂的语言进行说明,并采用了大量插图来说明算法是如何工作的,易于理解。 4.算法的“伪代码”形式简明实用。 书中的算法均以非常简明的“伪代码”形式来设计,可以很容易地把它转化为计算机程序,直接应用。 注重算法设计的效率,对所有的算法进行了仔细、精确的运行时间分析,有利于进一步改进算法。 三、本书的用法 本书对内容进行了精心的设计和安排,尽可能考虑到所有水平的读者。即使是初学计算机算法的人,也可以在本书中找到所需的材料。 每一章都是独立的,读者只需将注意力集中到最感兴趣的章节阅读。 1.适合作为教材或教学参考书。 本书兼顾通用性与系统性,覆盖了许多方面的内容。本书不但阐述通俗、严谨,而且提供了大量练习和思考题。针对每一节的内容,都给出了数量和难度不等的练习题。练习题用于考察对基本内容的掌握程度,思考题有一定的难度,需进行精心的研究,有时还通过思考题介绍一些新的知识。 前言回到顶部↑本书提供了对当代计算机算法研究的一个全面、综合性的介绍。书中给出了多个算法,并对它们进行了较为深入的分析,使得这些算法的设计和分析易于被各个层次的读者所理解。力求在不牺牲分析的深度和数学严密性的前提下,给出深入浅出的说明。. 书中每一章都给出了一个算法、一种算法设计技术、一个应用领域或一个相关的主题。算法是用英语和一种“伪代码”来描述的,任何有一点程序设计经验的人都能看得懂。书中给出了230多幅图,说明各个算法的工作过程。我们强调将算法的效率作为一种设计标准,对书中的所有算法,都给出了关于其运行时间的详细分析。 本书主要供本科生和研究生的算法或数据结构课程使用。因为书中讨论了算法设计中的工程问题及其数学性质,因此,本书也可以供专业技术人员自学之用。 本书是第2版。在这个版本里,我们对全书进行了更新。所做的改动从新增了若干章,到个别语句的改写。 致使用本书的教师 本书的设计目标是全面、适用于多种用途。它可用于若干课程,从本科生的数据结构课程到研究生的算法课程。由于书中给出的内容比较多,只讲一学期一般讲不完,因此,教师们应该将本书看成是一种“缓存区”或“瑞典式自助餐”,从中挑选出能最好地支持自己希望教授的课程的内容。 教师们会发现,要围绕自己所需的各个章节来组织课程是比较容易的。书中的各章都是相对独立的,因此,你不必担心意想不到的或不必要的各章之间的依赖关系。每一章都是以节为单位,内容由易到难。如果将本书用于本科生的课程,可以选用每一章的前面几节内容;在研究生课程中,则可以完整地讲授每一章。 全书包含920多个练习题和140多个思考题。每一节结束时给出练习题,每一章结束时给出一些

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧