数据结构编程笔记二十八:第十章 内排序 各种排序算法效率比较

本文探讨了在大数据量下,包括快速排序、归并排序等6种内排序算法的实际性能表现。通过程序执行和时间测量,分析了不同算法的效率。请注意,执行时间受CPU、内存性能和当前状态影响,建议根据计算机性能调整测试数据规模。文章末尾预告将总结C语言编程技巧,作为系列的最后一篇。
摘要由CSDN通过智能技术生成

上次我们介绍了各种内排序算法的实现,这次介绍这些算法在大数据量情况下真实的表现。

还是老规矩:

程序在码云上可以下载。
地址: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);

    
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值