冒泡排序算法的C++,Java和Python实现和冒泡排序算法三种语言效率的比较
冒泡排序原理:
这一篇百度经验讲得很好,我不多说了
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实现和冒泡排序算法三种语言效率的比较的更多相关文章
- java php c# 三种语言的AES加密互转
java php c# 三种语言的AES加密互转 最近做的项目中有一个领取优惠券的功能,项目是用php写得,不得不佩服,php自带的方法简洁而又方便好用.项目是为平台为其他公司发放优惠券,结果很囧的是 ...
- python列表和字符串的三种逆序遍历方式
python列表和字符串的三种逆序遍历方式 列表的逆序遍历 a = [1,3,6,8,9] print("通过下标逆序遍历1:") for i in a[::-1]: print( ...
- Java 数组元素逆序Reverse的三种方式
Java 数组元素逆序Reverse的三种方式 本文链接:https://blog.csdn.net/xHibiki/article/details/82930521 题目 代码实现 说明 int ...
- python实现XML解析的三种方法
python实现XML解析的三种方法 三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合:二是xml.sax.*模块,它是SAX API的实 ...
- Python实现微信支付(三种方式)
Python实现微信支付(三种方式) 关注公众号"轻松学编程"了解更多. 如果需要python SDk源码,可以加我微信[1257309054] 在文末有二维码. 一.准备环境 1 ...
- Python+Selenium自动化-设置等待三种等待方法
Python+Selenium自动化-设置等待三种等待方法 如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候,就需要我们通过设置一个等待条件,等待页面元素加载完成,避免出现 ...
- Java三大框架之——Hibernate中的三种数据持久状态和缓存机制
Hibernate中的三种状态 瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- java.lang.UnsatisfiedLinkError: Native method not found 三种可能解决方案
so文件编译生成后,运行时,有时候会遇到java.lang.UnsatisfiedLinkError: Native method not found问题,有可能是以下三种因素: 一.Jni方法头部大 ...
随机推荐
- 转:C# lock用法
lock 的目的很明确:就是不想让别人使用这段代码,体现在多线程情况下,只允许当前线程执行该代码区域,其他线程等待直到该线程执行结束:这样可以多线程避免同时使用某一方法造成数据混乱. 一般定义如下: ...
- chmod chown llinux文件及目录的权限介绍
linux 文件或目录的读.写.执行权限说明: chmod :设置文件或目录权限. u:所有者 g:所在组 o:其他组 a:所有人(u.g.o的总和) chmod -R 文件1/文件2….. ...
- No module named 'MySQLdb' Python3 + Django 2.0.3 + mysql 无法连接
问题概览: 学习Django连接mysql数据库的时候遇到了问题 首先安装mysql(Python 3不支持MySQL-python): pip install pymysql 进入编辑 settin ...
- 微信小程序里使用阿里巴巴矢量图标
登录 阿里巴巴矢量图标 (https://www.iconfont.cn) 选中图标,加入购物车图标 下载源代码 解析出来如下文件结构 有两种使用方式: 1)不转换成base64的文件 找到 icon ...
- Flink 的广播变量
Flink 支持广播变量,就是将数据广播到具体的 taskmanager 上,数据存储在内存中,这样可以减缓大量的 shuffle 操作: 比如在数据 join 阶段,不可避免的就是大量的 shuff ...
- VGA、DVI、HDMI、DP 接口介绍及优劣
VGA.DVI.HDMI.DP 接口介绍及优劣 随着日新月异的发展,就目前显卡上面常见的输出接口而言,我们所熟知的有以下几种: VGA.DVI.HDMI和DP (DisplayPort). 这四种 ...
- BZOJ1005:[HNOI2008]明明的烦恼(组合数学,Prufer)
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...
- linux 的常用命令---------第九阶段
Centos 7 系统启动及相关配置文件(面试题) 1. BIOS 初始化,开始post开机自检(主要检查磁盘.cpu.内存) 2. 加载 MBR 到内存 3. GRUB 阶段(可不说) 4. 加载内 ...
- Linux备份压缩命令
gzip 命令 把/home/chenjialins目录下的familyA目录下所有文件压缩成.gz文件cd /home/chenjialinstar -cvf /home/chenjialins/f ...
- Python高级知识点总结
一.可迭代对象.迭代器对象和生成器 像list, tuple等这些序列是可以使用for...in ...语句来进行遍历输出的.这是为什么呢?这就需要知道可迭代对象(Iterable).迭代器对象(It ...