插入排序算法与归并排序算法比较

  • 实验目的

通过插入排序算法与归并排序算法效率对比体会算法在求解问题中的重要性。

  • 实验内容
  1. 分别编写函数实现插入排序算法和归并排序算法;
  2. 利用随机函数产生大量数据存入数组作为待排序列;
  3. 分别测试待排序列数据量为1000、1万、10万、100万、1000万的情况下两种算法各自的运行时间,通过对比分析研究哪个算法在数据量逐渐增大时效率高;
  4. 对两种算法进行理论分析哪个算法效率高;
  5. 与实验数据对照,检查是否实验结果验证了理论分析的结果。
  • 算法伪代码

直接插入排序:

for j=2 to A.length

key=A[j]

i=j-1;

while i>0 and A[i]>key

A[i+1]=A[i]

i=i-1

A[i+1]=key

归并排序:

MERGE(A,p,q,r)

n1=q-p+1;

n2=r-q;

for i=0 to n1

L[i]=A[p+i-1]

for j=0 to n2

R[j]=A[q+j]

L[n1]=INF//假设1000是无穷大

R[n2]=INF

i=j=1

for k=p to r

if(L[i]<=R[j])

A[k]=L[i]

i=i+1

else

A[k]=R[j]

j=j+1

MERGE_SORT(A,p,r)

if p<r

q=floor((p+r)/2)

MERGE_SORT(A,p,q)

MERGE_SORT(A,q+1,r)

MERGE(A,p,q,r)

  • 理论分析
  1. 每个算法时间复杂度分析

直接插入排序的时间复杂度为Q(n2),归并排序的时间复杂度为Q(nlgn)。

  1. 结论

归并排序的算法比直接插入排序的算法的增长速度慢,也就是说,当数据量大的时候,归并排序将占有优势,速度快于插入排序。当数据量小的时候,插入排序将占有优势,速度快于归并排序。。

测试数据:1000、1万、10万、100万、1000万

运行结果界面截图

  • 性能测试

测试结果示例:(单位:微秒)

算法名称

运行时间/s

数据量

1000

1万

10万

100万

1000万

平均运行时间

插入排序

838.1

80828.8

7.40966e+006

9.17404e+008

Q(n2)

归并排序

152.8

1793.5

17411

213525

2.31033e+006

Q(nlgn)

七、源代码

​
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<set>
#include<windows.h>
const int INF = 1e8;
const long long maxn = 1e8 + 10;
const long long mod = 1e9 + 7;
int a1[maxn], a2[maxn];
int L[maxn]= {0};
int R[maxn]= {0};
using namespace std;
void insertSort(int *a,int n)//直接插入排序
{int tmp,j;for(int i=1; i<n; i++){tmp=a[i];j=i-1;while(j>=0&&tmp<a[j]){a[j+1]=a[j];j--;}a[j+1]=tmp;}
}
void Marge(int *a,int left,int mid,int right)
{int n1=mid-left+1;int n2=right-mid;int i,j;for(i=0; i<=n1; i++)L[i]=a[left+i-1];for(j=0; j<=n2; j++)R[j]=a[mid+j];L[n1+1]=INF;R[n2+1]=INF;i=1;j=1;for(int k=left; k<=right; k++){if(L[i]<=R[j]){a[k]=L[i];i++;}else{a[k]=R[j];j++;}}
}
void MargeSort(int *a,int left,int right)
{if(left<right){int mid=(left+right)/2;MargeSort(a,left,mid);MargeSort(a,mid+1,right);Marge(a,left,mid,right);}elsereturn ;
}
int main()
{ios::sync_with_stdio(false);//C++为了兼容C而采取的保守措施cin.tie(0), cout.tie(0);//减少cin,cout时间int n;while(~scanf("%d",&n)){for(int i = 0; i < n; i++){a1[i] = rand() % 100000000;a2[i] = a1[i];}/*cout << "待排序的数字:" <<endl;for(int i=0; i<10; i++){cout << a1[i] << endl;}*///首先获取CPU频率double run_time;_LARGE_INTEGER time_start;//开始时间_LARGE_INTEGER time_over;//结束时间double dqFreq;//计时器频率LARGE_INTEGER f;//计时器频率QueryPerformanceFrequency(&f);dqFreq=(double)f.QuadPart;cout<<"CPU主频:"<<dqFreq<<"kHz"<<endl; //单位为秒,精度为000/(cpu主频)微秒QueryPerformanceCounter(&time_start);insertSort(a1, n);  //插入排序计时QueryPerformanceCounter(&time_over);run_time=1000000*(time_over.QuadPart-time_start.QuadPart)/dqFreq;//乘以1000000把单位由秒化为微秒,精度为1000 000/(cpu主频)微秒cout<<"插入排序计时:"<<run_time<<endl;/*cout << "插入排序后的数字:" <<endl;for(int i = 0; i < n; i++){cout << a1[i] << ' ';cout << endl*/QueryPerformanceCounter(&time_start);MargeSort(a2,0,n-1);//归并排序计时QueryPerformanceCounter(&time_over);run_time=1000000*(time_over.QuadPart-time_start.QuadPart)/dqFreq;//乘以1000000把单位由秒化为微秒,精度为1000 000/(cpu主频)微秒cout<<"归并排序计时:"<<run_time<<endl;/*cout << "归并排序后的数字:" <<endl;for(int i = 0; i < n; i++){cout << a2[i] << ' ';}cout << endl;*/}return 0;
}​

算法设计与分析 ——插入排序算法与归并排序算法比较相关推荐

  1. 算法设计与分析第七章分支限界算法(完结篇)

    算法设计与分析第七章分支限界算法 一.分支界限算法概述 1.分支限界法类似于回溯法,是一种在问题的解空间树上搜索问题解的算法. 分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解 ...

  2. 算法设计与分析第一章递推算法

    算法设计与分析 第一章 递推算法 1.概述 在**已知条件**和**所求问题**之间总存在着某种相互联系的关系,如果可以找到前后过程之间的数量关系(即递推式),那么,从**问题出发逐步推到已知条件** ...

  3. 算法设计与分析——十大经典排序算法二(6--10)

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com  Time of completion:2023.3.1 Las ...

  4. 算法设计与分析_[04] 天牛须算法设计思想分析

    原文链接: https://arxiv.org/abs/1710.10724​arxiv.org 算法实现: 首先,初始化参数 ,分别代表初始解,初始的搜索范围,以及更新步长,且通过原文我们知道: 在 ...

  5. 算法设计与分析第3章 贪心算法

    第4章 贪心算法 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 贪心算法的基本要素 1.贪心选择性质 所谓贪心选择性质是指所 ...

  6. 算法设计与分析——递归与分治——归并排序

    归并排序采用的是一种分治的思想,如下图,先将要排序的元素分为两块,每个块又开始分裂,然后逐个按照特定顺序合并,合成最后我们需要的数组. 归并排序的复杂度: 时间复杂度:O(nlogn) 空间复杂度:O ...

  7. 《算法设计与分析基础》Chapt 2 算法效率分析基础

    2.1 分析框架 2.1.1 输入规模的度量 大多数情况,以输入数n 矩阵,维数 数值算法,数字的比特数 2.1.2 运行时间的度量单位 找出算法中最重要的操作,即基本操作 计算他们的运行次数 2.1 ...

  8. 【算法设计与分析】流水作业调度问题 动态规划算法与代码实现 超详细

    题目描述 "加工顺序问题"又被称为"批处理作业调度问题". 设有n个工件需要在机器M1和M2上加工,每个工件的加工顺序都是先在M1上加工,然后在M2上加工.t1 ...

  9. 算法设计与分析-TSP六种方法-贪心算法(最近邻点、最短链接)、蛮力法、动态规划法、回溯法、分支限界法、模拟退火

    旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径, ...

最新文章

  1. jquery easyui 动态绑定数据列
  2. ue4材质节点怎么用_UE4材质教程
  3. linux centos7使用,linux之centos7防火墙基本使用
  4. html body background color,HTML Style backgroundColor用法及代码示例
  5. SQL SERVER自定义函数
  6. 《暗时间》-----摘记
  7. 不服OceanBase跑分?今天起可到阿里云上一战
  8. Python数据分析模块 | pandas做数据分析(三):统计相关函数
  9. 关于C#解决无法解析skinEngine和使用皮肤的问题
  10. 基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达
  11. Java 问答:终极父类(第一部分)
  12. sql安装过程中,为 SQL Server 代理服务提供的凭据无效。若要继续操作,请为 SQL
  13. MIDAS分布应用程序中的几个问题
  14. 一淘网是马云手中的防守牌
  15. html5测试网速插件,js 检测客户端网速
  16. 电商网站建设步骤_电商网站建设的注意事项_OctShop
  17. 漏洞修复:TLS 1.0 enabled
  18. Android吃鸡 3dtouch,绝地求生刺激战场3Dtouch怎么用 刺激战场3Dtouch吃鸡技巧详解
  19. 安装ubuntu20.4桌面系统
  20. win10 + Ubuntu 18.04.1 LTS (Bionic Beaver) 双系统的安装配置

热门文章

  1. stream 流的并发
  2. 如何使用Redhawk验证ESD承压(未完成)
  3. android CTS和GTS测试FAIL项解决集锦
  4. 基于javaweb+jsp的银行信息管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot)
  5. z3学习笔记(python 3)
  6. jQuery水平滑动导航栏
  7. AntDB入选《爱分析:2022数据智能厂商全景报告》
  8. 基于Google Maps API的地图应用开发
  9. 联想服务器查raid型号,联想服务器所配备RAID卡规格
  10. APP审核通过,显示可销售状态,在App store 上搜不到