热门标签 | 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的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
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社区 版权所有