基本算法研究1-冒泡排序算法测试

基本算法研究1-冒泡排序算法测试

1、经典冒泡排序法基本原理

先看一个动态图,感觉比较形象:

        冒泡排序(Bubble Sort)是一种简单的排序算法。默认是从小到大排序,即把最大的数据排在最后,相当于每次把最大数据像气泡一样浮到水面一样。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换。

        基本步骤:

        1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
        2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
        3、针对所有的元素重复以上的步骤,除了最后一个。
        4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 

       最经典的冒泡排序法就是两层For循环嵌套。外层For循环是“趟”数,内层是每一“趟”对相邻的两个数据进行大小比较,根据需要进行交换位置。

    int a[SORT_NUM];for (int i=0; i<SORT_NUM; i++)a[i]=arc4random()%SORT_NUM+1;//随机生成数组

for (int i=0; i<SORT_NUM; i++)//外层循环{
for (int j=0; j<SORT_NUM-i-1; j++)//内层循环{
if (a[j]>a[j+1])//交换数据{int temp=a[j];a[j]=a[j+1];a[j+1]=temp;} }}

2、冒泡排序的性能

时间复杂度:平均:O(n²)  最好:O(n²) 最差:O(n²)

        稳定:稳定的

空间复杂度:O(1)

备注:在n较小时排序效果比较好,优点是比较简单。但是随着n的增大,耗时增加很快。

3、实际测试结果

使用Xcode对冒泡排序进行了测试,结果如下

nn倍数第1次第2次第3次平均时间倍数使用时间(单位)
10 18.0025.0314.0119.01 微秒
1001067.9770.9943.9960.983.21微秒
1000102.071.942.082.0333.29毫秒
10 00010298.59265.01279.29280.96138.40毫秒
100 0001029.8931.1832.5131.19111.01
200 0002129.95122.60128.04126.984.07

 

基本上可以发现,随着数据规模增加到之前的N倍,所用的时间是之前所用时间的N²倍。比如一万数据用时是280.96毫秒,十万数据用时是31.19秒,十万数据用时是一万数据用时的111.01倍(大约是10²倍)。和冒泡排序法的时间复杂度O(N²)是相符的。

测试程序如下:

在Xcode下运行。

#import <Foundation/Foundation.h>
#define SORT_NUM 200000 //需要排序的数组的长度
int main(int argc, const char * argv[]) {
#pragma mark --startint a[SORT_NUM];printf("未排序:");for (int i=0; i<SORT_NUM; i++){//随机生成数组a[i]=arc4random()%SORT_NUM+1;// printf(" %d",a[i]);}NSDate * startTime=[NSDate date];startTime=[startTime dateByAddingTimeInterval:60*60*8];for (int i=0; i<SORT_NUM; i++)//外层循环{for (int j=0; j<SORT_NUM-i-1; j++)//内层循环{if (a[j]>a[j+1])//交换数据{int temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}NSDate * endTime=[NSDate date];endTime=[endTime dateByAddingTimeInterval:60*60*8];NSTimeInterval sortTime=[endTime timeIntervalSinceDate:startTime];printf("\n排序后:\n");//for (int i=0; i<SORT_NUM; i++)// printf(" %d",a[i]);NSLog(@"开始时间:%@",startTime);NSLog(@"结束时间:%@",endTime);NSLog(@"使用时间:%.2f微秒",sortTime*1000000);NSLog(@"使用时间:%.2f毫秒",sortTime*1000);NSLog(@"使用时间:%.2f秒",sortTime);printf("\n冒泡排序\n");#pragma mark --endreturn 0;
} 

转载于:https://www.cnblogs.com/nathan1987/p/4839497.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CS-证书指纹修改

cobaltstrike.store是cobalt strike的证书文件&#xff0c;CS是java编写的&#xff0c;修改证书需要Java环境&#xff0c;搜索keytool,把证书复制到该目录进行操作&#xff0c;需要cmd以管理员权限才能生成成功。 证书默认密码&#xff1a;123456 查看证书指纹&#xff1a; key…

Java中的低延迟FIX引擎

总览 Chronicle FIX是我们的Low Latency FIX引擎和Java数据库。 是什么使它与众不同&#xff1f; 是为Java中的超低GC *设计的。 支持字符串和日期时间的方式可以最大程度地减少垃圾和开销。 可自定义为仅包含您期望的字段。 使用通常在二进制解析器和生成器中使用的优化&…

钓鱼文件名反转office远程模板

本文内容涉及程序/技术原理可能带有攻击性&#xff0c;仅用于安全研究和教学使用&#xff0c;务必在模拟环境下进行实验&#xff0c;请勿将其用于其他用途。因此造成的后果自行承担&#xff0c;如有违反国家法律则自行承担全部法律责任&#xff0c;与作者及分享者无关 0x01 件…

Cobalt Strike特征修改

在红蓝对抗以及hvv等等情况下&#xff0c;我们都会用到 Cobalt Strike&#xff0c;那么它也是安全公司重点关注的对象&#xff0c;跟msf类似&#xff0c;但CS操作相对比MSF使用简单&#xff0c;同时也有一个强大的插件库。那么&#xff0c;这么红的工具&#xff0c;特征方面安全…

工厂模式与抽象工厂模式

1、工厂模式&#xff1a;定义了一组创建对象的接口&#xff0c;但是由子类决定要实例化的类是哪一个。工厂方法把类的实例化推迟到子类中。 现在考虑有PizzaStore有一些子类&#xff08;加盟店&#xff09;&#xff0c;他们有可能对pizza的做法进行一些改良&#xff0c;即creat…

数据类型转换为false的有哪些?

看图&#xff0c;看选项你就明白啦

CS通过(CDN+证书)powershell上线详细版

0x00 简介 这个应该叫做域前置技术&#xff1a; 大致图示&#xff1a; 攻击流量通过CDN节点将流量转发到真实的C2服务器CDN节点ip通过识别请求的Host头进行流量转可以有效的躲避一些安全设备&#xff0c;也有这一定的反溯源功能&#xff0c;因为流量都去了CDN上 之前看了一些…

红蓝对抗之流量加密(Openssl加密传输、MSF流量加密、CS修改profile进行流量加密)

本篇文章转载于:https://blog.csdn.net/q20010619/article/details/122006433?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_utm_term~default-1-122006433-blog-122810834.pc_relevant_default&spm1001.2101.3001.4242.2&utm_relevant_index4 文…

有var d = new Date(‘20xx-m-09‘),可以设置为m+1月份的操作是?

setMonth(n)&#xff0c;这里是0-11分别对应1-12月 d.setDate(n); n表示一个月中的一天的一个数值&#xff08;1 ~ 31&#xff09;: 0 为上一个月的最后一天 -1 为上一个月最后一天之前的一天 如果当月有 31 天: 32 为下个月的第一天 如果当月有 30 天: 32 为下一个月的第二…

深入理解Java引用类型

深入理解Java引用类型 在Java中类型可分为两大类&#xff1a;值类型与引用类型。值类型就是基本数据类型&#xff08;如int ,double 等&#xff09;&#xff0c;而引用类型,是指除了基本的变量类型之外的所有类型&#xff08;如通过 class 定义的类型&#xff09;。所有的类型在…

值得一谈的鸿蒙2.0,程序员们拿起你们手中的编译器撸一下hello world

一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统 。现已开源,名为OpenHarmony。 2019年8月9日,华为在HDC开发者大会上正式发布鸿蒙系统。 2020年9月10日,华为在HDC开发者大会上如约发布鸿蒙 2.0,并面向应用开发者发布Beta版本…

GitHack使用方法

ctf小白刚下载这个&#xff0c;不知道怎么用。现在会用啦就记录一下~ 下载地址&#xff1a;https://github.com/lijiejie/GitHack 下载下来后&#xff0c;通过cmd使用&#xff0c;如下图所示&#xff1a; 总结&#xff08;命令&#xff09;&#xff1a; GitHack.py http://XXXX…

值得一谈的鸿蒙2.0,赶紧撸一下hello world

一款“面向未来”、面向全场景&#xff08;移动办公、运动健康、社交通信、媒体娱乐等&#xff09;的分布式操作系统 。现已开源&#xff0c;名为OpenHarmony。2019年8月9日&#xff0c;华为在HDC开发者大会上正式发布鸿蒙系统。2020年9月10日&#xff0c;华为在HDC开发者大会上…

【Jenkins】未授权访问漏洞

一、漏洞介绍 1 ) Jenkins介绍 Jenkins是一个基于Java开发的开源项目&#xff0c;可在Tomcat等流行的servlet容器中运行&#xff0c;也可以独立运行&#xff0c;其功能如下&#xff1a; 用于持续性、自动的构建/测试软件项目监控或跑一些定时任务监控外部调用执行的工作 2 …

解决谷歌浏览器F12打不开调试页面的问题。

最近应用着急上线&#xff0c;需要批量测试&#xff0c;发现F12不好使啦。 解决办法&#xff1a; 1.找到谷歌浏览器&#xff1a;设置-扩展程序-开发者模式。关闭。 2.刷新浏览器或者重启浏览器后&#xff0c;打开需要调试的页面&#xff0c;鼠标点一下地址栏&#xff0c;按F1…

还有另一个报告生成器?

如果您具有业务应用程序开发的经验&#xff0c;那么很可能会遇到要求该应用程序具有灵活的报告机制的需求。 我工作的公司主要专注于开发业务解决方案&#xff0c;而报告是必不可少的&#xff0c;的确&#xff0c;它必须包含我们开发的所有企业系统的方面。 为了在我们的系统中…

ARL资产侦察灯塔系统搭建及使用

ARL资产侦察灯塔系统搭建及使用 ARL&#xff08;Asset Reconnaissance Lighthouse&#xff09;资产侦查灯塔旨在快速发现并整理企业外网资产并为资产构建基础数据库&#xff0c;无需登录凭证或特殊访问即可主动发现并识别资产&#xff0c;让甲方安全团队或者渗透测试人员快速寻…

window电脑关闭自动更新的方法,妈妈再也不用担心我开机等电脑啦

公司的新电脑&#xff0c;每次关机开机都会更新&#xff0c;今天更新了3次&#xff0c;每次半小时&#xff0c;我忍不了&#xff0c;赶紧关闭自动更新。 1.winR打开面板输入services.msc&#xff0c;然后回车。 2.找到windows Update,右键找到 属性。 3.把启动类型改为“禁用”…

我是如何解决电脑连接WiFi提示无线适配器或访问点有问题

今天国庆后第一天上班&#xff0c;打开电脑一直连接不上我手机的热点&#xff0c;提示无线适配器或访问点有问题。可能是由于重启电脑自动更新系统的缘故&#xff0c;关闭电脑自动更新的办法请参考我的上一篇文章&#xff1a;window电脑关闭自动更新的方法 不说废话&#xff0…

如何使用git下载别人在github的代码?

今天东哥让我帮他们公司检查一下几十款产品的前端代码&#xff0c;我用新电脑作业了一下&#xff0c;简单分享git如何下载别人的代码。 完整教程请参考我上篇文章&#xff1a;——> Git教程学习总结 首先本地有git环境。打开git bash here。 查看一下版本 初始化git使…