实验9 排序算法实验比较
实验目的
基于教材内容,任选两种排序算法,实现并比较性能。
基本要求
(1)至少要有一种排序算法的性能优于O(n2)
(2)对实现的排序算法进行实验比较,实验比较数据参见教材7.8章节
(3)排序算法要基于教材,测试输入的整数数据文件(5个,文件中数据规模分别是100,1K,10K,100K和1M),排序结果也要输出到文件中。
(4)要在屏幕上输出排序过程所花费时间。
(5)提交最终实验作业。用附件的形式,提交两个文件:一个压缩包(包含源码和5个用于排序测试的数据文件);一个pdf文档(文档中包含实验日志和一个根据基本要求(1)记录实验结果的表格,然后进行适当的实验结果分析)。
实验九-排序算法实验比较-实验日志
【2021.1.4】
任务1:按照实验八中生成随机数的方法,分别随机生成数据量大小为“100”、“1K”、“10K”、“100K”、“1M”大小的数据,分别存储在对应的文件中。随机函数比较简单,这一步很顺利就完成了。
任务2:设计好完成五个文件排序后的输出界面,将排序结果输出到对应的文件中;利用LARGE_INTEGER frequency;//时钟频率,计算出相应排序所用时间,再在交互界面输出。
出现问题:输出时间太小
解决方法:将时间输出*10000,单位为us
修改后输出:
【2021.1.5】
任务1:稍微修改sort的main函数文件,对五组数据数量不同的数据,分别进行两组排序(插入排序和shell排序),记录所用时间,制作相应表格。
结果分析:
插入排序的时间复杂度为O(
),在规模增大时,可以明显看出其查找的平均时间增大。Shell排序的时间复杂度为O(n long n)。排序的时间复杂度和数据有很大关系,在前三组数据量较小的情况下,两种算法差距不大,但在最后两组100K、1M的数据量下,shell排序比插入排序时间消耗小很多。
可见,在进行排序操作时,不同的算法在数据量大规模增加时,所需要的时间代价有很大差距,我们在平时的作业、练习中遇到的几乎都是规模很小的数据,这时候采取增长幅度大的算法可能感受不出来,一旦数据量几何式增长,代价大的算法很可能直接造成运行崩溃,所以我们应该对各种算法的时间、空间代价有一个基本的认识,尽量采用代价小的算法。
【2021.1.6】
任务:完善实验日志,上交实验代码和日志报告。
查找功能的代码:
#include <iostream>
#include <time.h>
#include <algorithm>
#include <fstream>
#include <windows.h>
using namespace std;
LARGE_INTEGER frequency;//时钟频率
double begin_time,end_time,dft,dff,dfm;
void swap(int A[],int i,int j)
{
int trans = A[i];
A[i] = A[j];
A[j] = trans;
}
void inssort(int A[],int n)//插入排序
{
for(int i = 1; i < n ; i++)
for(int j = i ; j>0 ; j--)
{
if(A[j] < A[j-1])
swap(A,j,j-1);
}
}
void inssort2(int A[],int n,int incr)
{
for(int i = incr; i < n; i += incr)
for(int j = i ; j >= incr; j-=incr)
{
if(A[j] < A[j-incr])
swap(A,j,j-incr);
}
}
void shellsort(int A[],int n)//shell排序
{
for(int i = n/2 ; i >= 2 ; i /=2)
for(int j = 0 ; j < i ; j++)
inssort2(&A[j],n-j,i);
inssort2(A,n,1);
}
int main()
{
srand((int)time(NULL));//重置时间种子
QueryPerformanceFrequency(&frequency);//获得时钟频率
dff=(double)frequency.QuadPart;//取得频率
int n;n = 1024*10;
int A[n];
ifstream input1("10K.txt");
for(int i = 0 ; i < n ; i++)
{
input1 >> A[i];
}
input1.close();
QueryPerformanceCounter(&frequency);
begin_time=frequency.QuadPart;//获得初始值
inssort(A,n);
QueryPerformanceCounter(&frequency);
end_time=frequency.QuadPart;//获得终止值
dfm=(double)(end_time-begin_time);//差值
dft=dfm/dff;//差值除以频率得到时间
cout << "数据量大小为10K时,插入排序消耗时间为" <<dft*10000<<"us" << endl;
ofstream outfile1("10K_answer.txt");
for(int i = 0 ; i< n ; i++)
{
outfile1 << A[i] <<" ";
if((i+1) %10 ==0)
outfile1 << endl;
}
outfile1 <<endl << "数据量大小为10K时,插入排序消耗时间为" <<dft*10000<<"us" << endl;
outfile1.close();
for(int i = 0 ; i < n ; i++)
{
input1 >> A[i];
}
input1.close();
QueryPerformanceCounter(&frequency);
begin_time=frequency.QuadPart;//获得初始值
shellsort(A,n);
QueryPerformanceCounter(&frequency);
end_time=frequency.QuadPart;//获得终止值
dfm=(double)(end_time-begin_time);//差值
dft=dfm/dff;//差值除以频率得到时间
cout << "数据量大小为10K时,shell排序消耗时间为" <<dft*10000<<"us" << endl;
ofstream outfile2("10K_answer.txt");
outfile2 << "数据量大小为10K时,插入排序消耗时间为" <<dft*10000<<"us" << endl;
outfile2.close();
return 0;
}
随机数产生代码:
#include <iostream>
#include <time.h>
#include <algorithm>
#include <vector>
#include <fstream>
using namespace std;
const int max_size = 1024*1024;//10M大小
int main()
{
srand((int)time(NULL));//重置时间种子
vector<int> num_list;
ofstream outfile("1M.txt");
for(int i = 0 ; i < max_size ; i++)
{
int k= rand()%max_size;
num_list.push_back(k);
outfile <<num_list[i] << " ";
if((i+1) % 10 == 0)
outfile << endl;
}
outfile.close();
ofstream outfile1("100.txt");
for(int i = 0 ; i < 100 ; i++)
{
int k = rand()%max_size;
outfile1 << k << " ";
if((i+1) % 10 == 0)
outfile1 << endl;
}
outfile1.close();
ofstream outfile2("1K.txt");
for(int i = 0 ; i < 1024 ; i++)
{
int k = rand()%max_size;
outfile2 << k << " ";
if((i+1) % 10 == 0)
outfile2 << endl;
}
outfile2.close();
ofstream outfile3("10K.txt");
for(int i = 0 ; i < 1024*10 ; i++)
{
int k = rand()%max_size;
outfile3 << k << " ";
if((i+1) % 10 == 0)
outfile3 << endl;
}
outfile3.close();
ofstream outfile4("100K.txt");
for(int i = 0 ; i < 1024*100 ; i++)
{
int k = rand()%max_size;
outfile4 << k << " ";
if((i+1) % 10 == 0)
outfile4 << endl;
}
outfile4.close();
cout << "随机数生成成功" << endl;
}