- 实验要求
1) 排序 n 个元素,元素为随机生成的长为1..32的字符串(字符串均为英文小写字母),n的取值为:2^2,2^5,2^8,2^11,2^14,2^17;
2) 算法:直接插入排序,堆排序,归并排序,快速排序;
3) 字符串大小判断标准:首先按字符串长度进行排序(短字符串在前,长字符串在后)。然后对长度相同的字符串,按字母顺序进行排序;
4) 对结果进行性能分析。 - 实验环境
1) 编译环境:Dev-C++ 5.9.2
2) 机器内存:8G
3) 时钟主频:2.2GHz - 实验过程
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) 进行结果分析。 - 实验关键代码截图
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],