冒泡排序、快速排序、基数排序、计数排序算法性能分析

本文通过实验详细分析了冒泡排序、快速排序、基数排序和计数排序在不同规模数据下的性能。实验结果显示,对于小规模数据,快速排序优于冒泡排序,而当数据规模增大时,计数排序表现最佳。所有算法的性能分析图表揭示了它们各自的时间复杂度特性,为选择合适的排序算法提供了依据。
摘要由CSDN通过智能技术生成
  1. 实验要求
    1) 排序n个元素,元素为随机生成的1到65535之间的整数,n的取值为: 2^2,2^5,2^8,2^11,2^14,2^17 ;
    2) 算法:冒泡排序,快速排序,基数排序,计数排序;
    3) 对结果进行性能分析。
  2. 实验环境
    1) 编译环境:Dev-C++ 5.9.2
    2) 机器内存:8G
    3) 时钟主频:2.2GHz
  3. 实验过程
    1) 实现getnums函数(input.cpp源码在文件夹input中),随机产生2^17个1~65535间的整数,将整数写入文件input_numbers.txt中;
    2) 实现冒泡排序BubbleSort.cpp,其中产生不同规模下冒泡排序的结果result_n.txt和运行时间time.txt;
    3) 实现快速排序QuickSort.cpp,其中产生不同规模下快速排序的结果result_n.txt和运行时间time.txt;
    4) 实现基数排序MergeSort.cpp,其中产生不同规模下基数排序的结果result_n.txt和运行时间time.txt;
    5) 实现计数排序QuickSort.cpp,其中产生不同规模下计数排序的结果result_n.txt和运行时间time.txt;
    6) 进行结果分析。
  4. 实验关键代码截图
    1) getnums函数实现思路:产生2^17个1~65535间的随机数字写入input_numbers.txt中,数字间以换行间隔。
void getnums()
{
    FILE *fp;
    int i,slen,j;
    int temp;
    srand((unsigned)time(NULL));
    fp = fopen("input_numbers.txt", "w");
    for (i = 0; i < NUM; i++)
    {   
        temp = rand()*rand() % 65535 + 1;
        fprintf(fp,"%d",temp);      
        fputc('\n',fp);
    }
    fclose(fp); 
}

2) 记录运行时间的方法(级别us):

#include "windows.h"

static LARGE_INTEGER Freq;
static LARGE_INTEGER start;
static LARGE_INTEGER end;
static double dt;//用于计时

void count_start()
{
    QueryPerformanceFrequency(&Freq);
    QueryPerformanceCounter(&start);
}

double count_stop()
{
    QueryPerformanceCounter(&end);
    dt = (end.QuadPart - start.QuadPart)/(double)(Freq.QuadPart);
    return dt;
}

3) 冒泡排序过程
a)从输入数据input_numbers.txt中读取前num(问题规模)个数字存入numtemp[num]中(先读取一行数字字符串,再用函数atoi()将读的字符串转成整型数)

fp = fopen("..\\\\input\\input_numbers.txt","r");
rewind(fp);
memset(numtemp,0,num*sizeof(int));
for(j = 1; j <= num; j++)
{   
    memset(strtemp[j],0,7*sizeof(char));
    fscanf(fp,"%s",strtemp[j]); 
    numtemp[j] = atoi(strtemp[j]);      
}
fclose(fp);

b) 实现冒泡排序的过程(swap实现交换两个数字的功能,起始用上述记录时间的方法来记录运行时间)

count_start();  //开始排序
for(i = num-1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值