冒泡排序原理:

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

https://jingyan.baidu.com/article/6525d4b13f920bac7d2e9484.html

他讲的是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 <iostream>
#include<time.h> using namespace std; void print(int a[],int n)
{
for (int k = ; k < n; k++)
{
cout << a[k] << endl;
}
} int main()
{ clock_t startTime, endTime;
startTime = clock(); int a[] = { ,,,,,,, }; //获取数组的长度
int n = sizeof(a) / sizeof(a[]);
//第一个元素只需要和n-1个元素进行比较
//第二个元素只需要和n-2个元素进行比较
//以此类推
for (int i = ; i < n - ; i++)
{
//第一个元素只需要和n-1个元素进行比较
//第二个元素只需要和n-2个元素进行比较
//以此类推
for (int j = ; j < n - i - ; j++)
{
//只要前面的元素大于后面的元素,立即交换
if (a[j] > a[j + ])
{
int temp = a[j];
a[j] = a[j + ];
a[j + ] = temp;
} } cout << "第" << i + << "步骤" << endl;
print(a, n); }
cout << "最终结果" << endl;
print(a, n); endTime = clock();
cout << "Totle Time : " << (double)(endTime - startTime)* / CLOCKS_PER_SEC << "ms" << endl; system("pause");
return ;
}

Java实现

package com.xgt.util;

import java.lang.reflect.Method;

/**
* @author cjy
* @Date 2018/6/19 15:25.
*/
public class BubbleSort {
static void print(int[] arr,int n)
{
for(int k=0;k<arr.length;k++){
System.out.print(arr[k]+",");
}
System.out.println();
} private static final int a[] = {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 = a.length;
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(a[j]>a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
System.out.println("第"+(i+1)+"个步骤");
print(a,n);
}
System.out.println("最终结果");
print(a,n);
} /**
* 计算方法执行时间
* @param method 所有方法都是Method类的对象
*/
private static void methodExecutionTime (Method method) {
long begin = System.nanoTime();
try {
method.invoke(new BubbleSort(), a);
} catch (Exception e) {
e.printStackTrace();
} long end = System.nanoTime() - begin;
System.out.println(method.getName() + "方法耗时:" + end/1000 + "纳秒");
}
}

Python实现

#!/usr/bin/env python
# coding:utf-8
import time def bubbleSort(nums):
for i in range(len(nums)-1): # 这个循环负责设置冒泡排序进行的次数
for j in range(len(nums)-i-1): # j为列表下标
if nums[j] > nums[j+1]:
t = nums[j];
nums[j] = nums[j+1];
nums[j+1] = t;
print"第",i+1,"步骤"
print(nums)
return nums nums = [5,9,7,6,1,8,13,4]; start = time.time()
bubbleSort(nums)
end = time.time()
print (end-start)*1000000,"微秒"
语言 Java Python C++
平均时间(ms) 1322 999 24

Java运行时间控制台截图

Python运行时间截图

C++运行时间截图

效率排行:C++>Python>Java

冒泡排序算法的C++,Java和Python实现和冒泡排序算法三种语言效率的比较的更多相关文章

  1. java php c# 三种语言的AES加密互转

    java php c# 三种语言的AES加密互转 最近做的项目中有一个领取优惠券的功能,项目是用php写得,不得不佩服,php自带的方法简洁而又方便好用.项目是为平台为其他公司发放优惠券,结果很囧的是 ...

  2. python列表和字符串的三种逆序遍历方式

    python列表和字符串的三种逆序遍历方式 列表的逆序遍历 a = [1,3,6,8,9] print("通过下标逆序遍历1:") for i in a[::-1]: print( ...

  3. Java 数组元素逆序Reverse的三种方式

    Java 数组元素逆序Reverse的三种方式   本文链接:https://blog.csdn.net/xHibiki/article/details/82930521 题目 代码实现 说明 int ...

  4. python实现XML解析的三种方法

    python实现XML解析的三种方法 三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合:二是xml.sax.*模块,它是SAX API的实 ...

  5. Python实现微信支付(三种方式)

    Python实现微信支付(三种方式) 关注公众号"轻松学编程"了解更多. 如果需要python SDk源码,可以加我微信[1257309054] 在文末有二维码. 一.准备环境 1 ...

  6. Python+Selenium自动化-设置等待三种等待方法

    Python+Selenium自动化-设置等待三种等待方法   如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候,就需要我们通过设置一个等待条件,等待页面元素加载完成,避免出现 ...

  7. Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

    Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...

  8. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  9. java.lang.UnsatisfiedLinkError: Native method not found 三种可能解决方案

    so文件编译生成后,运行时,有时候会遇到java.lang.UnsatisfiedLinkError: Native method not found问题,有可能是以下三种因素: 一.Jni方法头部大 ...

随机推荐

  1. Windows DHCP备份还原命令

    DHCP服务器如果要更换,最简单的方法就是命令导入导出   导出netsh dhcp server export e:\dhcp.txt all 导入netsh dhcp server import ...

  2. cut切割,简单的取列

    cut 切割,简单的取列命令. -d 指定分隔符 -f 数字 取第几列 -c n-m 取n列到m列字符. //提取字符,不常用 例如:已知bqh.txt文件里的内容为“I am bqh myqq is ...

  3. October 29th, 2017 Week 44th Sunday

    There was another life that I might have had, but I am having this one. 我明明可以过另一种生活,但我却选择了这一种. Be re ...

  4. 【转】Android 4.4中播放HTML5视频<video>的Bug

    近期Nexus 4手机自动升级到Android4.4,本来挺好的一件事儿,结果发现自己的应用中出现一个Bug,应用中使用了Webview播放HTML5视频,代码如下: <video width= ...

  5. FreeBSD 12.0 版发布

    FreeBSD 是一个自由且开源的类 Unix 操作系统,是 BSD Unix 的直系继承者.起始于 1993 年,FreeBSD 拥有悠久的历史与诸多衍生版本.其饱经考验,是最广泛应用的开源 BSD ...

  6. DataGridView如何绑定DataRow对象集合

    DataGridView对象是我们在进行Winform程序开发中经常使用的呈现数据的控件,而数据则是通过DataSource这个Property来设置的.根据MSDN的说明,DataGridView对 ...

  7. Python2.7-hashlib

    hashlib模块,实现了支持多种不同哈希算法的接口,不同 hash 算法的构造函数就是算法名,返回的哈希对象都具有相同接口.哈希算法不是加密算法,所以下面提到的加密不是真的加密,因为真的加密需要能够 ...

  8. JAVA框架 SpringMVC RequestMapping讲解

    一.窄化请求映射 在class上做RequestMapping注解. 好处:避免在同一个项目中和其他人的url重复,出现请求混乱问题,便于管理. @Controller @RequestMapping ...

  9. C++之new和delete操作符

    在C语言中的动态分配和释放内存的函数是malloc calloc 和 free , 而在C++中要用 new new[] delete delete[] 来申请动态空间和释放空间. 注意:的是new. ...

  10. Android An unexpected exception occurred while creating a change object. see the error log for more details

    今天再给Android项目工程中的包重命名时出现了这个错误(之前重命名的时候就没有出现,郁闷):An unexpected exception occurred while creating a ch ...