标题:[原创]排序算法效率比较
取消只看楼主
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
 问题点数:0 回复次数:7 
[原创]排序算法效率比较

为计算排序算法效率写的测试程序:
#include <iostream>
#include <ctime>
#include <fstream>
using namespace std;

class Timer
{
clock_t start_time;
public:
Timer(){start_time=clock();}

void elaspe()
/*计算时间*/
{
clock_t end_time=clock();
cout<<"It takes "<<(double)(end_time-start_time)/(double)CLK_TCK<<"seconds\n";
}
/*时间归零*/
void reset(){start_time=clock();}
};


#define maxSortNum 4 /*定义排序算法的个数(种类)*/
class CCompositor
{
int *a;
public:
CCompositor(){a=NULL;}
~CCompositor(){delete []a;}
void FileMenu();
void Initional(int i);
void GetFile(ifstream&is,int size);
void doCompose(int n);
/*这里假定只有4种排序*/
void sort_1();
void sort_2();
void sort_3();
void sort_4();
};


void CCompositor::sort_1()
{
//增加代码,完成你的算法
}

void CCompositor::sort_2()
{
//增加代码,完成你的算法
}

void CCompositor::sort_3()
{
//增加代码,完成你的算法
}

void CCompositor::sort_4()
{
//增加代码,完成你的算法
}

void CCompositor::GetFile(ifstream&is,int size)
{
//if(!is)exit(1);
delete a;a=NULL;
a=new int[size];
for(int i=0;i<size;i++)
is>>a[i];
}

void CCompositor::FileMenu()
/*列出所有不同类型的数据*/
{
cout<<" 算法比较数据文件目录\n";
cout<<" ——————————————"<<endl;
cout<<" 1. 数据长度20个, 顺序\n";
cout<<" 2. 数据长度200个, 顺序\n";
cout<<" 3. 数据长度2000个, 顺序\n";
cout<<" 4. 数据长度20个, 逆序\n";
cout<<" 5. 数据长度200个, 逆序\n";
cout<<" 6. 数据长度2000个, 逆序\n";
cout<<" 7. 数据长度20个, 随机\n";
cout<<" 8. 数据长度200个, 随机\n";
cout<<" 9. 数据长度2000个, 随机\n";
cout<<" 10.数据长度20个, 部分排序\n";
cout<<" 11.数据长度200个, 部分排序\n";
cout<<" 12.数据长度200个, 部分排序\n";
cout<<"请选择...";
}
void CCompositor::Initional(int i)
/*根据不同的文件数据进行数据加载*/
{
ifstream is;
switch(i)
{
case 1:is.open("order20.txt"); //长度20, 顺序
GetFile(is,20);break;
case 2:is.open("order200.txt"); //长度200, 顺序
GetFile(is,200);break;
case 3:is.open("order2000.txt"); //长度2000,顺序
GetFile(is,2000);break;
case 4:is.open("unOrder20.txt"); //长度20, 逆序
GetFile(is,20);break;
case 5:is.open("unOrder200.txt"); //长度200, 逆序
GetFile(is,200);break;
case 6:is.open("unOrder2000.txt"); //长度2000,逆序
GetFile(is,2000);break;
case 7:is.open("noOrder20.txt"); //长度20, 随机
GetFile(is,20);break;
case 8:is.open("noOrder200.txt"); //长度200, 随机
GetFile(is,200);break;
case 9:is.open("noOrder2000.txt"); //长度2000,随机
GetFile(is,2000);break;
case 10:is.open("partlyOrder20.txt"); //长度20, 部分排序
GetFile(is,20);break;
case 11:is.open("partlyOrder200.txt"); //长度200, 部分排序
GetFile(is,200);break;
case 12:is.open("partlyOrder2000.txt");//长度2000,部分排序
GetFile(is,2000);break;
default:cout<<"Can't find any file to associate your choice\n";
}
is.close();
}
void CCompositor::doCompose(int n)
{
switch(n)
{
case 1:sort_1();break;
case 2:sort_2();break;
case 3:sort_3();break;
case 4:sort_4();break;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
CCompositor compose;
compose.FileMenu();
int choice;cin>>choice;
compose.Initional(choice);
Timer time;
for(int j=0;j<maxSortNum;j++)
{
compose.doCompose(j+1);
time.elaspe();
time.reset();
}
return 0;
}

搜索更多相关主题的帖子: 算法效率 clock time start include 
2006-07-26 15:42
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
我也想过用函数指针放进数组,但是忘记怎么做了

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-26 16:09
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
不同类型的数据种类其实都可以放在容器中,不是啊,这个是测试用的数据,是从文件中读取的。读进数组进行排序,用容器代替数组,对排序有帮助,所以你才建议我用容器的,是吗?

成员函数做函数指针数组怎么做,请说详细点,我这里看书只是一跳而过了

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-26 16:16
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
你这个思想到是很好,就是不知道从何下手~!
is.open("order20.txt");         //文件关联
cout&lt;&lt;"      1. 数据长度20个,   顺序\n";  //一个输出语句而已
GetFile(is,20)                  //成员函数

如何把他们联系在一个容器结构中啊?

我不会。。。请指教,下次不敢再做同样蠢事

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-26 17:58
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
如果用文件,我觉得每重只保留最长的那个文件就行了,可以只读取一部分。

恩,是的。
但是aogun说的容器怎么实现还是不知

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-26 20:06
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
回复:(aogun)昨天没时间一般来说,对于有很多同样格...
谢谢了,知道怎么联系他们了,觉得这个指针放数组和相关内容的关联的确是很重要也是很必要的一个知识

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-27 19:24
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 

正如你说的那样,改过以后清晰很多

[此贴子已经被作者于2006-7-28 12:59:48编辑过]


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-28 12:58
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
我按照你说的改了下:
程序代码:
#include "stdafx.h"
#include &lt;iostream&gt;
#include &lt;ctime&gt;
#include &lt;fstream&gt;
using namespace std;

class Timer
{
    clock_t start_time;
public:
    Timer(){start_time=clock();}

    void elaspe()
    /*计算时间*/
    {
        clock_t end_time=clock();
        cout&lt;&lt;"It takes "&lt;&lt;(double)(end_time-start_time)/(double)CLK_TCK&lt;&lt;"seconds\n";
    }
    /*时间归零*/
    void reset(){start_time=clock();}
};


#define maxSortNum 4    /*定义排序算法的个数(种类)*/
class CCompositor
{
    int *a;
public:
    CCompositor(){a=NULL;}
    ~CCompositor(){delete []a;}
    void FileMenu();
    void Initional(int i);
    void GetFile(ifstream&amp;is,int size);
    void doCompose(int n);
    void sort_1();
    void sort_2();
    void sort_3();
    void sort_4();
};


typedef void (CCompositor::*sort)();
sort g_x[] = {&amp;CCompositor::sort_1, &amp;CCompositor::sort_2, &amp;CCompositor::sort_3, &amp;CCompositor::sort_4};


struct SortStruct 
{
    int m_iIndex;    //索引
    char* m_pChoice; //文件类型
    char* m_pFile;     //文件路径
    int m_iInfoSize; //文件大小
};


SortStruct sortArr[]={
    1, "      1. 数据长度20个,   顺序\n",    "order20.txt",            20,
        2, "      2. 数据长度200个,  顺序\n",    "order200.txt",            200,
        3, "      3. 数据长度2000个, 顺序\n",      "order2000.txt",            2000,
        4, "      4. 数据长度20个,   逆序\n",      "unOrder20.txt",            20,
        5, "      5. 数据长度200个,  逆序\n",      "unOrder200.txt",            200,
        6, "      6. 数据长度2000个, 逆序\n",      "unOrder2000.txt",        2000,
        7, "      7. 数据长度20个,   随机\n",      "noOrder20.txt",            20,
        8, "      8. 数据长度200个,  随机\n",      "noOrder200.txt",            200,
        9, "      9. 数据长度2000个, 随机\n",      "noOrder2000.txt",        2000,
        10,"      10.数据长度20个,   部分排序\n","partlyOrder20.txt",        20,
        11,"      11.数据长度200个,  部分排序\n","partlyOrder200.txt",        200,
        12,"      12.数据长度200个,  部分排序\n","partlyOrder2000.txt",    2000,
};


void CCompositor::sort_1()
{
    //增加代码,完成你的算法
}

void CCompositor::sort_2()
{
    //增加代码,完成你的算法
}

void CCompositor::sort_3()
{
    //增加代码,完成你的算法
}

void CCompositor::sort_4()
{
    //增加代码,完成你的算法
}

void CCompositor::GetFile(ifstream&amp;is,int size)
{
    //if(!is)exit(1);
    delete a;a=NULL;
    a=new int[size];
    for(int i=0;i&lt;size;i++)
    is&gt;&gt;a[i];
}


void CCompositor::FileMenu()
/*列出所有不同类型的数据*/
{
    cout&lt;&lt;"         算法比较数据文件目录\n";
    cout&lt;&lt;"      ——————————————"&lt;&lt;endl;
    for (int i=0;i&lt;sizeof(sortArr)/sizeof(SortStruct);i++)
    {
        cout&lt;&lt;sortArr[i].m_pChoice;
    }
    cout&lt;&lt;"请选择...";
}
void CCompositor::Initional(int i)
/*根据不同的文件数据进行数据加载*/
{
    ifstream is;
    is.open(sortArr[i-1].m_pFile);
    GetFile(is,sortArr[i-1].m_iInfoSize);
    is.close();
}


int _tmain(int argc, _TCHAR* argv[])
{
    CCompositor compose;
    compose.FileMenu();
    int choice;cin&gt;&gt;choice;
    compose.Initional(choice);
    Timer time;
    for(int j=0;j&lt;sizeof(g_x)/4;j++)
    {
        g_x[j];    
        time.elaspe();
        time.reset();
    }
    return 0;
}

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-28 12:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-80375-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.175988 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved