上次我们介绍了各种内排序算法的实现,这次介绍这些算法在大数据量情况下真实的表现。
还是老规矩:
程序在码云上可以下载。
地址:https://git.oschina.net/601345138/DataStructureCLanguage.git
排序算法的解释就省略了,书上都有。
衡量排序算法好坏比较直接的标准是时间,我们可以通过以下方法得到排序算法执行的时间:
start = clock(); //记录开始时间
XxxSort(L); //执行排序算法
end = clock(); //记录结束时间
resultTime = end - start; //结束时间-开始时间就是排序算法耗费的时间
注意:1.程序的执行会花费较长时间,因为6种排序算法各要执行100次;
2.程序执行的结果具有不可再现性,因为程序的执行结果与CPU、内存的性能和当前状态有关;
3.请根据执行程序计算机的实际情况来确定待排序元素个数,不能过多也不能过少,
由于计算机的性能存在差异,教室多媒体电脑的CPU和内存性能会比较差,
如果长时间无法显示结果(如下),说明该计算机性能较差,请尝试减少元素数量:
-------------------------------内排序算法效率比较------------------------------
您想给顺序表初始化多少个元素?(输入一个不超过10000的整数) 10000
+------------------------------------------------------------------------------+
| 排序结果 |
+----------+------------------+------------------------------------------------+
| 排名 | 排序方法名称 | 排序花费时间(毫秒) |
+----------+------------------+------------------------------------------------+
【光标在这里闪烁,长时间没反应】
如果运行结果很快执行完成且多处存在0值(如下情况),请尝试增加元素数量:
-------------------------------内排序算法效率比较------------------------------
您想给顺序表初始化多少个元素?(输入一个不超过10000的整数) 2
+------------------------------------------------------------------------------+
| 排序结果 |
+----------+------------------+------------------------------------------------+
| 排名 | 排序方法名称 | 排序花费时间(毫秒) |
+----------+------------------+------------------------------------------------+
| 1 | 直接插入排序 | 0 |
+----------+------------------+------------------------------------------------+
| 2 | 折半插入排序 | 0 |
+----------+------------------+------------------------------------------------+
| 3 | 希尔排序 | 0 |
+----------+------------------+------------------------------------------------+
| 4 | 起泡排序 | 0 |
+----------+------------------+------------------------------------------------+
| 5 | 快速排序 | 0 |
+----------+------------------+------------------------------------------------+
| 6 | 选择排序 | 0 |
+----------+------------------+------------------------------------------------+
| 7 | 归并排序 | 0 |
+----------+------------------+------------------------------------------------+
4.为了公平起见,所有排序算法都会执行100次,每次的数字均由计算机随机生成,最终结果
取平均值作为排序算法的效率衡量指标,如果想要多次执行,请在出现提示后按下除N或n外
的其他键,程序会重新执行。
以下是程序代码:
//*************************引入头文件**************************
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
//*************************自定义符号常量*********************
#define OVERFLOW -2 //内存溢出错误常量
#define ILLEGAL -1 //非法操作错误常量
#define OK 1 //表示操作正确的常量
#define ERROR 0 //表示操作错误的常量
#define TRUE 1 //表示逻辑正确的常量
#define FALSE 0 //表示逻辑错误的常量
#define MAXSIZE 10000 //一个用作示例的小顺序表的最大长度
#define EQ(a,b) ((a)==(b)) //相等
#define LT(a,b) ((a)< (b)) //小与
#define LQ(a,b) ((a)<= (b)) //小与等于
#define SORTNUM 8 //共有8种排序算法,如果日后需要扩展排序算法种类,请修改这里
//************************自定义数据类型**********************
typedef int Status; //状态标志
typedef int KeyType; //定义关键字类型为整数类型
typedef int InfoType; //信息类型
typedef struct{ //元素类型
KeyType key; //关键字域
InfoType otherinfo; //其他数据项(记录该数据项的初始位置)
}RedType; //记录类型
typedef struct{
RedType r[MAXSIZE+1]; //r[0]闲置或用作哨兵单元
int length; //顺序表长度
}SqList; //顺序表类型
//--------------------记录排序结果的存储结构-------------------
typedef struct{
float resultTime; //排序花费的时间
char* name; //排序方法名称
}Result;
//*****************顺序表的主要操作***********************
//-------------------1.初始化顺序表----------------------------
/*
函数:InitList_Sq
参数:SqList &L 顺序表引用
返回值:状态码,操作成功返回OK
作用:根据用户输入创建一棵二叉排序树
*/
Status InitList_Sq(SqList &L){
while(1){
printf("您想给顺序表初始化多少个元素?(输入一个不超过10000的整数) ");
scanf("%d", &L.length);
if(L.length > 0 && L.length <= 10000){
break;
}//if
}//while
//操作成功
return OK;
}//InitList_Sq
/*
函数:GenerateRandNumber
参数:SqList &L 顺序表引用
返回值:状态码,操作成功返回OK
作用:用随机数初始化元素值
*/
void GenerateRandNumber(SqList &L){
for(int i = 1; i <= L.length; ++i) {
//用随机数初始化元素值
L.r[i].key = (int)(rand() % 20000 + 1);
//记录元素的初始位置
L.r[i].otherinfo = i;
}//for
}//GenerateRandNumber
//----------------------------------2.遍历顺序表------------------------------------
/*
函数:Print
参数:RedType r 被访问记录
返回值:状态码,操作成功返回OK
作用:元素访问函数
*/
Status Print(RedType r) {
//以控制台输出的方式访问记录
printf("%d[%d] ", r.key, r.otherinfo);