大家好,我是烤鸭:

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

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

java 实现 常见排序算法(一) 冒泡排序相关推荐

  1. android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些

    学Java能拿高薪吗?Java中常见排序算法有哪些?作为老牌编程语言,Java拥有广阔的市场占有率,几乎90%以上的大中型互联网应用系统在服务端开发都会首选Java.为了加入到Java这一高薪行业,很 ...

  2. Java 实现常见排序算法

    Java 实现常见排序算法 1. 综述 复习常见排序算法,用Java实现. 2. 代码 1 package cn.edu.tju.scs; 2 3 public class Sort { 4 publ ...

  3. java 实现 常见排序算法(四)基数排序

    大家好,我是烤鸭: 今天分享一下基础排序算法之基数排序. 1.    基数排序: 原理:基数排序(radix sort)属于"分配式排序"(distribution sort),又 ...

  4. java 实现 常见排序算法(三)快速排序

    大家好,我是烤鸭: 今天分享一下基础排序算法之快速排序.快速排序是内部排序(基于比较排序)中最好的比较算法. 1.     快速排序: 原理:在要排的数(比如数组A)中选择一个中心值key(比如A[0 ...

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

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

  6. Java实现常见排序算法

    排序 排序算法是程序员入门基础算法,下边我们使用Java语言实现常见内部排序算法. 内部排序:待排序记录全部存放在内存中进行排序的过程. 外部排序:待排序记录的数量很大,以至于内存不能容纳全部记录,在 ...

  7. 常见排序算法:冒泡排序

    为什么80%的码农都做不了架构师?>>>    从这篇文章开始,我会陆陆续续将我所能用Java实现的算法在这里简单做个梳理,也算温故而知新吧.受个人水平和时间限制,可能会有错漏,欢迎 ...

  8. 常见排序算法之冒泡排序

    /*** 冒泡排序的核心就是,按顺序进行两两比较,如果第一个比第二个大则交换位置*/ public class MaoPaoPaiXu {private static int[] bubbleSort ...

  9. Java排序算法:冒泡排序

    Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...

最新文章

  1. 软件测试基础--笔记6
  2. 【深度学习】深入浅出 CRF-RNN Layer(The End-to-end)
  3. 发现藏匿在加密流量中的威胁
  4. 智能门锁中CPU卡加密
  5. [python爬虫] 爬取图片无法打开或已损坏的简单探讨
  6. ![CDATA[ ]]
  7. 如果你想写自己的Benchmark框架
  8. Linq找不到行或行已更改
  9. 日常赠书 | 王者荣耀的觉悟AI是怎么训练的?
  10. KONG网关 — 插件开发
  11. 仿函数functors
  12. java 设置时区_Java Calendar如何设置时区
  13. 新浪微博开发者创新基金开始接受申请
  14. 在生成式AI的崛起中,百度“先下一城”
  15. Linux系统如何查看服务器带宽及网络使用情况
  16. 阿里云使用笔记(一):从零开始配置阿里云GPU服务器训练深度学习模型
  17. 大裁员席卷阿里,P9 大咖连夜赠书,奋战 2 个月成功斩获 offer
  18. 探秘2022亚运会主场馆丨“大小莲花”智慧升级,带你见证科技力量
  19. 海报字体设计常规的方法(上)
  20. [玩转UE4/UE5动画系统>应用篇>功能模块] 之 ALS V4 主状态机详解

热门文章

  1. 工作387-vant控制日期范围
  2. [css] 说说你对hasLayout的理解,触发hasLayout的方式有哪些?
  3. [css] absolute的containing block(容器块)计算方式和正常流有什么区别?
  4. [js] fetch和axios请求的原理都是基于XMLHttpRerequst吗?
  5. 工作214:结构 vue操作一个很有意思的报错 [Vue warn]: You may have an infinite update loop in a component
  6. 前端学习(2627):node安装
  7. java面试题36 已知如下的命令执行 java MyTest a b c 请问哪个语句是正确的? ( )
  8. mybatis学习(20):模糊查询$
  9. 第五十七期:小型企业将如何从5G中受益
  10. java学习(64):类访问私有内部内部类方法