java 实现 常见排序算法(一) 冒泡排序

大家好,我是烤鸭:    

   今天分享一下基础排序算法之冒泡排序。

 

1.     冒泡排序:

 原理:比较两个相邻的元素,将较大的元素交换至右端。

思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。

实现:

/*** 冒泡排序* bubbleSort* 时间复杂度,O的n^2* 对于冒泡排序,相信对每个人人都很熟悉,这个是每个学习编程的人都会学习的排序方法* 具体的原理就是未排好,自上而下的比较,小的数就往上冒,大的数就往下沉,按理来说冒泡排序总共的次数最多为n(n-1)/2*/
public void bubbleSort(int[] array) {long nowTime = System.currentTimeMillis();int tem = 0;int sortBorder= array.length - 1;for (int i = 0; i < array.length - 1; i++) {int jBorder = sortBorder - i;for (int j = 0; j <  jBorder; j++) {if (array[j] > array[j + 1]) {tem = array[j];array[j] = array[j + 1];array[j + 1] = tem;}}}System.out.println("冒泡排序,花费时间(s):" + (System.currentTimeMillis() - nowTime) / 1000.0 + "s");}

2.     冒泡排序优化:

如果已经排序好,就不需要再排序了。

比如{2,1,3,5,4,6,8,7,9} 。

循环 倒数第二次已经是 {1,2,3,4,5,6,7,8,9},就需要再比较最后一次了。

比较第一次变为 {1,2,3,4,5,6,8,7,9},第二次从 2 开始就不需要比较那么多了,只需要最远比较到上一次交换的位置。

public void bubbleSort(int[] array) {long nowTime = System.currentTimeMillis();int tem = 0;//记录最后一次交换的位置int lastExchangeIndex = 0;//无序数列的边界,每次比较只需要比到这里为止int sortBorder= array.length - 1;boolean isSorted;for (int i = 0; i < array.length - 1; i++) {isSorted = true;for (int j = 0; j < sortBorder; j++) {if (array[j] > array[j + 1]) {tem = array[j];array[j] = array[j + 1];array[j + 1] = tem;//数组无序isSorted = false;//把无序数列的边界更新为最后一次交换元素的位置lastExchangeIndex = j;}}sortBorder = lastExchangeIndex;if(isSorted) break;}System.out.println("冒泡排序,花费时间(s):" + (System.currentTimeMillis() - nowTime) / 1000.0 + "s");}

3.     冒泡排序升级之鸡尾酒排序:

void cocktailSort(int[] array) {long nowTime = System.currentTimeMillis();int top = array.length - 1;int bottom = 0;boolean flag = true;int i, j;while (flag) {flag = false;//从小到大,升序for (i = bottom; i < top; i++) {if (array[i] > array[i + 1]) {CommonSortAlgorithmUtils.swap(array, i, i + 1);flag = true;}}top--;//从大到小,降序for (j = top; j > bottom; j--) {if (array[j] < array[j - 1]) {CommonSortAlgorithmUtils.swap(array, j, j - 1);flag = true;}}bottom++;}System.out.println("冒泡排序之鸡尾酒排序,花费时间(s):" + (System.currentTimeMillis() - nowTime) / 1000.0 + "s");}

CommonSortAlgorithmUtils.java:

package algorithm;/*** Created by on 2018/7/24*/
public class CommonSortAlgorithmUtils {//交换方法static  void swap(int[] data, int i, int j) {int tmp=data[i];data[i]=data[j];data[j]=tmp;}
}

耗时对比:

10W 条随机 数据 运行如图:

可以看出优化的优势不明显。鸡尾酒排序时间明显缩短。

50W 条随机 数据 运行如图:

可以看出优化的稍微有优势。鸡尾酒排序时间明显缩短。

100W 条随机 数据 运行如图:

可以看出优化的稍微有优势。鸡尾酒排序时间明显缩短。

总结:

冒泡排序写法比较简单。

冒泡排序的最坏时间复杂度为:O(n2) 。

冒泡排序总的平均时间复杂度为:O(n2) 。

各种排序方法比较:

 

更多排序算法:

插入排序   :  https://blog.csdn.net/Angry_Mills/article/details/81208700

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue学习之npm

任何一门计算机语言都包含了丰富的第三方库&#xff0c;npm就是JavaScript这门语言的第三方库管理工具&#xff0c;本文详细介绍了JavaScript的包管理工具&#xff0c;npm。 在计算机中安装好Node.js之后&#xff0c;默认已经安装好了npm包管理工具&#xff0c;我们可以输入npm…

idea的maven project消失解决方案

方案一&#xff1a;点击菜单栏View->Tool Windows->Maven projects 方案二&#xff1a;File -> Settings -> Plugins -> Installed ->找到下面两个并勾选->然后重启 1&#xff0c;Maven Integration 2&#xff0c;Maven Integration Extension

[css] 举例说明你知道的css技巧有哪些?

[css] 举例说明你知道的css技巧有哪些&#xff1f; /* 等比例容器 */ .ratio { position: relative; display: block; } .ratio:before { content: ; padding-top: 100%; float: left; } .ratio::after { content: ; display: block; clear: both; }/* 非表单元素也适用的 dis…

Java 深copy 浅copy 引用copy

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下浅copy和深copy。 1. 深copy 什么是深copy&#xff0c;只复制原对象属性值&#xff0c;不管地址。 说一下业务场景&#xff1a; 如果我想创建一个对象&#xff0c;只是对原对象的某个属性值改变。普通的做法就是new 一个…

ubuntu设置root密码及 Xftp连接linux(ubuntu)时提示ssh服务器拒绝了密码,请再试一次...

ubuntu设置root密码及 Xftp连接linux&#xff08;ubuntu&#xff09;时提示ssh服务器拒绝了密码&#xff0c;请再试一次 原文:ubuntu设置root密码及 Xftp连接linux&#xff08;ubuntu&#xff09;时提示ssh服务器拒绝了密码&#xff0c;请再试一次altf2,在弹出的运行窗口中输入…

[css] 判断第一行和第二行的颜色分别是什么?并解释为什么?

[css] 判断第一行和第二行的颜色分别是什么&#xff1f;并解释为什么&#xff1f; <style> .red {color:red;} .green {color:green;} </style><div class"red green">第一行&#xff1a;颜色是什么&#xff1f;</div> <div class"…

linux定时任务清理cache缓存

大家好&#xff0c;我是烤鸭&#xff1a; 如果你出现类似cache过多的情况&#xff0c;请参考这篇。 buff/cache 占了1.6G&#xff0c;多数情况下是无所谓的。但是有时候在系统内存不足的时候&#xff0c;可能会影响其他程序的执行。 之前就遇到过 jenkins 因为内存不足 集成失败…

SecureCRT Application 已停止工作

解决方法一&#xff1a; cmd ----> regedit —>HKEY_LOCAL_MACHINE\SOFTWARE\vandyke 删掉vandyke 解决方法二&#xff1a; SecureCRT使用过程中出现异常后自动关闭&#xff0c;导致下次无法正常启动&#xff08;运行程序无反应&#xff09;&#xff0c;此时一种可能的原…

SQLServer之事务简介

事务定义 事务是单个的工作单元。事务是在数据库上按照一定的逻辑顺序执行的任务序列&#xff0c;既可以由用户手动执行&#xff0c;也可以由某种数据库程序自动执行。 事务分类 自动提交事务 每条单独的语句都是一个事务。 在自动提交模式下&#xff0c; 每个数据库操作是在执…

[css] 用css怎么实现两端对齐?

[css] 用css怎么实现两端对齐&#xff1f; 文本的两端对齐<style>.form .text {display: inline-block;width: 65px;text-align-last: justify;}</style><div class"form"><div><span class"text">用户名</span><i…

springboot mybatis mysql8.0 异常 invalid bound statement (not found)(汇总篇)

大家好&#xff0c;我是烤鸭&#xff1a; 现在是采坑实录。 invalid bound statement (not found) 这个坑用过mybatis的人肯定都踩过。 1. 环境 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</ar…

Vmware centos无法连接网络

在vmware下安装了centos7&#xff0c;桥接模式&#xff0c;无法连接网络 解决方案一&#xff1a; 然后重启虚拟机 解决方案二&#xff1a; 然后再试试重启能否联网 解决方案三&#xff1a;

[css] 你有用过弹性布局吗?说说你对它的理解

[css] 你有用过弹性布局吗&#xff1f;说说你对它的理解 按我的经验在样式规律上大致分下类吧&#xff0c;等宽弹性布局单元素弹性布局多元素定比弹性布局等隙布局用 flex 或 grid 能非常轻松的完成以上效果&#xff0c;而 css2 时代多半还需要更多元素嵌套才能完成了。所谓弹…

洛谷P2015 二叉苹果树

题目描述 有一棵苹果树&#xff0c;如果树枝有分叉&#xff0c;一定是分2叉&#xff08;就是说没有只有1个儿子的结点&#xff09; 这棵树共有N个结点&#xff08;叶子点或者树枝分叉点&#xff09;&#xff0c;编号为1-N,树根编号一定是1。 我们用一根树枝两端连接的结点的编号…

mybatis 一对一 一对多 级联查询

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下关于mybatis的级联查询。 环境&#xff1a; mybatis 3.2.8 spring 4.1.9 1. 业务场景 在一个人申请某些账号或者权限的时候&#xff0c;比如微信的认证流程。 会让你一步一步按要求输入&#xff0c;比如第一步&am…

IDEA启动tomcat报错java.util.zip.ZipException: error in opening zip file

原因CATALINA_BASE参数后面多了一个斜杠 将&#xff1a;CATALINA_BASEK:\Tomcats\apache-tomcat-9.0.10_cform\ 改&#xff1a;CATALINA_BASEK:\Tomcats\apache-tomcat-9.0.10_cform

[css] 外边距重叠是什么?重叠的结果是什么?怎么防止外边距重叠?

[css] 外边距重叠是什么&#xff1f;重叠的结果是什么&#xff1f;怎么防止外边距重叠&#xff1f; 外边距重叠是什么&#xff1f;外边距重叠指的是&#xff0c;当两个垂直外边距相遇时&#xff0c;它们将形成一个外边距。 重叠后的外边距的高度等于两个发生重叠的外边距的高度…

JavaScript计算两个日期相差天数/分钟/小时

/*** 日期相减获取天数&#xff08;用于公式计算&#xff09;* param date1 日期一 例如:"{value:2020-06-05,date_format:yyyy-MM-dd}"* param date2 日期二 例如:"{value:2020-06-04,date_format:yyyy-MM-dd}"* returns {string}*/ function calcDateDay…

java 实现 常见排序算法(二) 插入排序

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下基础排序算法之直接插入排序。 1. 直接插入排序&#xff1a; 原理&#xff1a;假设前面的数为有序数列&#xff0c;然后有序数列与无序数列的每个数比较&#xff0c;我们可以从右向左比较 思路&#xff1a;从第2…

[css] css中的border:none和border:0px有什么区别?

[css] css中的border:none和border:0px有什么区别&#xff1f; none是没有边框. 0px是边框的宽度为0px.个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题