博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法导论6:排序小结和最值取法 2016.1.6
阅读量:5891 次
发布时间:2019-06-19

本文共 1338 字,大约阅读时间需要 4 分钟。

  今天想做测试各个排序算法运行时间比较的程序,来对这几天学的排序算法小结一下。所以我先生成了1000000个1~150之间的随机数存到文件里。然后做了一个测试运行时间的程序。想看一下结构。但是结果效果并不太好。实践中,自己做的qsort函数和mergesort函数并没有理想中的那么快。

结果是这样:(可能并不准确,但却是是运行结果)

库函数快速排序:0.139000 seconds

自制快速排序:0.375000 seconds
归并排序:0.358000 seconds
堆排序:0.525000 seconds
计数排序:0.032000 seconds
插入+归并排序:0.313000 seconds

显然,除了线性复杂度的计数排序,其他的都比系统自带的库函数运行的慢。

因此得出以下结论:

1.懂了算法思想并不一定能做出最棒的程序。

2.以后排序首选系统自带库函数和计数排序,其他的排序算法可以当作思想来借鉴。

 

那么排序算法大体就到这里。下一节一开始讲的是最值的选法。

从n个数里选出最小值。复杂度下界是n

从n个数里选出最大值。复杂度下界也是n

但是,从n个数里同时选出最小值和最大值,算法导论给出了复杂度(3/2)n的优化算法。

就是通过一个一个的比较改成一对一对的比较

     每次找两个数,先比较这两个数,然后让较大值与当前的最大值比较,让较小值与当前最小值比较。这样优化之后,原来每两个数要比较4次,现在只需要比较3次,所以复杂度优化成了原来的3/2 。

代码今天就先不打了,这个问题比较简单。可能需要分n为奇数还是偶数讨论一下。

 

PS:下面是测试排序时用到的生成随机数和测试时间的代码。

#include
#include
#include
int *makerandom(int n,int x){ int *a=(int *)malloc((n+1)*sizeof(int)); srand(time(0)); int i; for (i=1;i<=n;i++) { a[i]=rand()%x+1; } return a;}
#include
#include
#include
int main(){ long i=100000000L; clock_t start,finish; double duration; start=clock(); /*while (i--);*/ //测试时间的代码 finish=clock(); duration=(double)(finish-start)/CLOCKS_PER_SEC; printf("%lf seconds\n",duration); return 0;}

 

转载于:https://www.cnblogs.com/itlqs/p/5107838.html

你可能感兴趣的文章
白话讲反射技术 --- 适合初学者入门引导
查看>>
css变形 transform
查看>>
win7家庭版添加组策略编辑器
查看>>
lnmp环境搭建
查看>>
自定义session扫描器精确控制session销毁时间--学习笔记
查看>>
【转】EDK简单使用流程(3)
查看>>
Ubuntu中无法update的解决办法
查看>>
仿射变换
查看>>
decltype类型指示符
查看>>
虹软ArcFace人脸识别 与 Dlib 人脸识别对比
查看>>
laravel 验证码使用示例
查看>>
IE开发人员工具无法使用
查看>>
分页器(自定制)
查看>>
HDU1877 又一版 A+B
查看>>
往sde中导入要素类报错000732
查看>>
springboot之启动方式
查看>>
初次安装git配置用户名和邮箱及密钥
查看>>
6.1(续)索引、索引组织表--Oracle模式对象
查看>>
动画 球
查看>>
C++中的堆,栈,静态内存区,常量区
查看>>