- 实验要求
1) 排序n个元素,元素为随机生成的1到65535之间的整数,n的取值为: 2^2,2^5,2^8,2^11,2^14,2^17 ;
2) 算法:冒泡排序,快速排序,基数排序,计数排序;
3) 对结果进行性能分析。 - 实验环境
1) 编译环境:Dev-C++ 5.9.2
2) 机器内存:8G
3) 时钟主频:2.2GHz - 实验过程
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) 进行结果分析。 - 实验关键代码截图
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