热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python哪种算法效率最高_冒泡排序算法的C++,Java和Python实现和冒泡排序算法三种语言效率的比较...

冒泡排序原理:这一篇百度经验讲得很好,我不多说了他讲的是C语言,没有关系,冒泡原理都是一样的空间复杂度是O(1)时间最优复杂

冒泡排序原理:

这一篇百度经验讲得很好,我不多说了

他讲的是C语言,没有关系,冒泡原理都是一样的

空间复杂度是O(1)

时间最优复杂度是O(n),时间最差复杂度是O(n^2);

时间最优复杂度推导

假如我们要对一个数组1,2,4,5进行升序排序,我们第一趟循环就完成了,即3次,理想的情况下只需排序一趟,以此类推,n个数只需n-1次即可排序完成。所以复杂度是O(n)

时间最差复杂度推导

假如我们对一个数组5,4,2,1进行升序排序,这个数组正好是全降序,所以要三趟循环,第一趟比较3次,交换3次,第二趟比较2次,交换2次,第三趟比较1次,交换1次。所以是3*2*1=6次

继续推广,n个数在最差情况下需要n(n-1)/2次比较和交换才能完成,所以时间复杂度为O(n^2)

C++实现

/**

* @author cjy

* @Date 2018/6/19 15:00.*/#include#include

using namespacestd;void print(int a[],intn)

{for (int k = 0; k

{

cout<

}

}intmain()

{

clock_t startTime, endTime;

startTime&#61;clock();int a[8] &#61; { 5,9,7,6,1,8,13,4};//获取数组的长度

int n &#61; sizeof(a) / sizeof(a[0]);//第一个元素只需要和n-1个元素进行比较//第二个元素只需要和n-2个元素进行比较//以此类推

for (int i &#61; 0; i

{//第一个元素只需要和n-1个元素进行比较//第二个元素只需要和n-2个元素进行比较//以此类推

for (int j &#61; 0; j

{//只要前面的元素大于后面的元素&#xff0c;立即交换

if (a[j] > a[j &#43; 1])

{int temp &#61;a[j];

a[j]&#61; a[j &#43; 1];

a[j&#43; 1] &#61;temp;

}

}

cout<<"第" <

print(a, n);

}

cout<<"最终结果" <

print(a, n);

endTime&#61;clock();

cout<<"Totle Time :" <<(double)(endTime - startTime)*1000 / CLOCKS_PER_SEC <<"ms" <

system("pause");return 0;

}

Java实现

package com.xgt.util;import java.lang.reflect.Method;/**

* &#64;author cjy

* &#64;Date2018/6/19 15:25.

*/

public class BubbleSort {

static void print(int[] arr,int n)

{

for(int k&#61;0;k

System.out.print(arr[k]&#43;",");}

System.out.println();}

private static final int a[] &#61; {5,9,7,6,1,8,13,4};public static void main(String[]args) throws NoSuchMethodException {

methodExecutionTime(BubbleSort.class.getMethod("bubbleSort", new Class[]{int[].class}));}

public static void bubbleSort(int[]a){

int n&#61; a.length; for(int i&#61;0;i

for(int j&#61;0;j

if(a[j]>a[j&#43;1]){

int temp&#61; a[j]; a[j] &#61; a[j&#43;1]; a[j&#43;1] &#61; temp;}

}

System.out.println("第"&#43;(i&#43;1)&#43;"个步骤"); print(a,n);}

System.out.println("最终结果"); print(a,n);}

/**

* 计算方法执行时间

* &#64;param method 所有方法都是Method类的对象

*/

private static void methodExecutionTime (Method method) {

long begin&#61; System.nanoTime();try {

method.invoke(new BubbleSort(), a);} catch (Exception e) {

e.printStackTrace();}

long end&#61; System.nanoTime() - begin; System.out.println(method.getName() &#43; "方法耗时&#xff1a;" &#43; end/1000 &#43; "纳秒");}

}

Python实现

#!/usr/bin/env python#coding:utf-8

importtimedefbubbleSort(nums):for i in range(len(nums)-1): #这个循环负责设置冒泡排序进行的次数

for j in range(len(nums)-i-1): #&#xff4a;为列表下标

if nums[j] > nums[j&#43;1]:

t&#61;nums[j];

nums[j]&#61; nums[j&#43;1];

nums[j&#43;1] &#61;t;print"第",i&#43;1,"步骤"

print(nums)returnnums

nums&#61; [5,9,7,6,1,8,13,4];

start&#61;time.time()

bubbleSort(nums)

end&#61;time.time()print (end-start)*1000000,"微秒"

语言

Java

Python

C&#43;&#43;

平均时间(ms)

1322

999

24

Java运行时间控制台截图

Python运行时间截图

C&#43;&#43;运行时间截图

效率排行&#xff1a;C&#43;&#43;>Python>Java



推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
author-avatar
爱音乐的李雪梅
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有