hnu 数据结构 实验九

实验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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值