冒泡排序原理:

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

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. 转:ASP.NET前台代码绑定后台变量方法总结

    经常会碰到在前台代码中要使用(或绑定)后台代码中变量值的问题.一般有<%= str%>和<%# str %>两种方式,这里简单总结一下.如有错误或异议之处,敬请各位指教. 一方 ...

  2. LUA 运算笔记

    循环 比如要实现这样的一个For for(int i=10;i>1;i—) { print(i) } lua的for循环 转换成LUA for i=10,1,-1 do print(i) end ...

  3. seq 序列

    seq 序列用法: seq [option]...last seq [option]...first last seq [option]...first increment last 例如:seq 5 ...

  4. python的学习之路day4

    大纲 1.一些常用的内置函数 callable() chr() & ord() 随机生成验证码 map() 全局变量,局部变量 hash() & round() max() min() ...

  5. How HashMap works in java 2

    https://www.javacodegeeks.com/2014/03/how-hashmap-works-in-java.html   Most common interview questio ...

  6. [Spark RDD_add_2] Spark RDD 分区补充内容

    [Spark & Hadoop 的分区] Spark 的分区是切片的个数,每个 RDD 都有自己的分区数. Hadoop 的分区指的是 Reduce 的个数,是 Map 过程中对 Key 进行 ...

  7. PyQt5--GridLayout

    # -*- coding:utf-8 -*- ''' Created on Sep 13, 2018 @author: SaShuangYiBing ''' import sys from PyQt5 ...

  8. github与本地电脑关联配置

    参考文章:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137438585 ...

  9. WorldWind源码剖析系列:插件类Plugin、插件信息类PluginInfo和插件编译器类PluginCompiler

    插件类Plugin是所有由插件编译器加载的插件子类的抽象父类,提供对插件的轻量级的访问控制功能. 插件信息类PluginInfo用来存储关于某个插件的信息的类,可以理解为对插件类Plugin类的进一步 ...

  10. loadrunner中pacing的设置

    通常我们在谈到一个软件的“性能”的时候,首先想到的就是“响应时间”和“并发用户数”这两个概念.我们看到的性能需求经常都是这样定义的: “要求系统支持 100 个并发用户” 看到这样的性能需求,我们往往 ...