对字符串进行直接插入排序、堆排序、归并排序、快速排序实现以及性能分析

该博客详细介绍了对字符串进行直接插入排序、堆排序、归并排序和快速排序的实现过程,并在不同规模下进行了性能分析。实验结果显示,四种排序算法中,快速排序的平均性能最佳,其次是堆排序和归并排序,而直接插入排序效率最低。所有算法都在特定数据集上进行了测试,并使用Excel和Origin进行性能分析。
摘要由CSDN通过智能技术生成
  1. 实验要求
    1) 排序 n 个元素,元素为随机生成的长为1..32的字符串(字符串均为英文小写字母),n的取值为:2^2,2^5,2^8,2^11,2^14,2^17;
    2) 算法:直接插入排序,堆排序,归并排序,快速排序;
    3) 字符串大小判断标准:首先按字符串长度进行排序(短字符串在前,长字符串在后)。然后对长度相同的字符串,按字母顺序进行排序;
    4) 对结果进行性能分析。
  2. 实验环境
    1) 编译环境:Dev-C++ 5.9.2
    2) 机器内存:8G
    3) 时钟主频:2.2GHz
  3. 实验过程
    1) 实现getstrs函数(input.cpp源码在文件夹input中),随机产生2^17个均为小写字母的字符串,将字符串写入文件input_strings.txt中;
    2) 实现插入排序StraightInsertSort.cpp,其中产生不同规模下插入排序的结果result_n.txt和运行时间time.txt;
    3)实现堆排序HeapSort.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) getstrs函数实现思路:每个字符串都是先产生一个随机长度,然后产生长度个随机字符写入input_strings.txt中,字符串间以换行间隔。
void getstrs()
{
    FILE *fp;
    int i,slen,j;
    char temp;
    srand((unsigned)time(NULL));
    fp = fopen("input_strings.txt", "w");
    for (i = 0; i < NUM; i++)
    {   
        slen = rand()*rand() % 32 + 1;
        for (j = 0; j < slen; j++)
        {
            temp = 'a' + rand()*rand() % 26;
            fputc(temp,fp);
        }
        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) 从输入数据中读取前num (问题规模)个字符串存入strtemp[num][33]

fp = fopen("..\\\\input\\input_strings.txt","r");
rewind(fp);
for(j = 0; j < num; j++)
{
  //从输入数据中读取字符串
    memset(strtemp[j],
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值