冒泡排序(Java)

文章目录

  • 冒泡排序(Java)
    • 1.概念
    • 2.思路图解
      • 小结:
    • 3.演变过程

1.概念

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。

优化:因为排序过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,说明序列有序,因此在排序过程中设置一个标志flag判断元素是否进行过交换,从而减少不必要的比较。

2.思路图解

原始数组:3,9,-1,10,20

假设有两个指针,第一个指向第一个元素,第二个指向第二个元素,然后比较两个指针所指元素,最后同时进行++操作

第一趟排序:

(1)3,9,-1,10,20 //如果相邻的元素逆序就交换

(2)3,-1,9,10,20

(3)3,-1,9,10,20

(4)3,-1,9,10,20

第二趟排序:

(1)-1,3,9,10,20 //这里可以优化

(2)-1,3,9,10,20

(3)-1,3,9,1020

第三趟排序:

(1)-1,3,9,1020

(2)-1,3,91020

第四趟排序:

(1)-1,391020

小结:

(1)一共进行数组大小-1次大的循环

(2)每一趟排序的次数在减少

(3)如果我们发现在某一趟排序中,没有发生一次交换,可以提前结束冒泡排序

实例:原始数组:3,44,38,5,47,15,36,26,27,2,46,4,19,50,48

3.演变过程

package DataStructures.Sort;import java.util.Arrays;public class BubbleSort {public static void main(String[] args) {int[] arr = {3, 9, -1, 10, -2};//第一趟排序,将最大的数排在最后int temp = 0;//临时变量for (int j = 0; j < arr.length - 1; j++) {//如果前面的数比后面的大,则交换if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.println("第一趟排序后的数组:" + Arrays.toString(arr));//第二趟排序,将第二大的数排在倒数第二位for (int j = 0; j < arr.length - 1 - 1; j++) {//如果前面的数比后面的大,则交换if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.println("第二趟排序后的数组:" + Arrays.toString(arr));//第三趟排序,将第三大的数排在倒数第三位for (int j = 0; j < arr.length - 1 - 1 - 1; j++) {//如果前面的数比后面的大,则交换if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.println("第三趟排序后的数组:" + Arrays.toString(arr));//第四趟排序,将第四大的数排在倒数第四位for (int j = 0; j < arr.length - 1 - 1 - 1 - 1; j++) {//如果前面的数比后面的大,则交换if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.println("第四趟排序后的数组:" + Arrays.toString(arr));}
}

优化:for循环可以包起来

package DataStructures.Sort;import java.util.Arrays;public class BubbleSort {public static void main(String[] args) {int[] arr = {3, 9, -1, 10, -2};//第一趟排序,将最大的数排在最后int temp = 0;//临时变量for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - 1 - i; j++) {//如果前面的数比后面的大,则交换if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.printf("第%d趟排序后的数组:", i + 1);System.out.println(Arrays.toString(arr));}}
}

时间复杂度:O(n^2)

优化:设置一个flag判断是否进行过交换,减少交换次数

package DataStructures.Sort;import java.util.Arrays;public class BubbleSort {public static void main(String[] args) {int[] arr = {3, 9, -1, 10, -2};bubbleSort(arr);}/***@author ZJ*Description 冒泡排序*date 2022-05-05 23:39:27 23:39* @param arr*/public static void bubbleSort(int[] arr) {int temp = 0;//临时变量boolean flag = false;//标识变量,表示是否进行过交换for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - 1 - i; j++) {//如果前面的数比后面的大,则交换if (arr[j] > arr[j + 1]) {flag = true;temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}//System.out.printf("第%d趟排序后的数组:", i + 1);//System.out.println(Arrays.toString(arr));//在整个一次循环后进行判断if (!flag) {//在一趟排序中,一次交换都没有发生break;}flag = false;//重置flag,进行下次判断}}
}

80000数据测试

public static void main(String[] args) {//        int[] arr = {3, 9, -1, 10, -2};
//        bubbleSort(arr);//80000数组测试int[] arr = new int[80000];for (int i = 0; i < 80000; i++) {arr[i] = (int) (Math.random() * 8000000);//生成[0,8000000)的随机数}Date date1 = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String date1Str = simpleDateFormat.format(date1);System.out.println("排序前时间是" + date1Str);bubbleSort(arr);Date date2 = new Date();String date2Str = simpleDateFormat.format(date2);System.out.println("排序后时间是" + date2Str);}

冒泡排序(Java)相关推荐

  1. 冒泡排序(java实现)

    冒泡排序,就是每次遍历都会把最小(或者最大)的数放在前面.比如要升序{A1,........An}  第一次排序要取出整个数组中最小放在A1的位置,从An开始往前遍历,相邻两个数比较,如果Aj < ...

  2. 冒泡排序java代码_看动画学算法之:排序冒泡排序

    点击上方的蓝字关注我吧 程序那些事 简介 排序可能是所有的算法中最最基础和最最常用的了.排序是一个非常经典的问题,它以一定的顺序对一个数组(或一个列表)中的项进行重新排序. 排序算法有很多种,每个都有 ...

  3. 冒泡排序 java_冒泡排序Java版本

    一.冒泡排序的基本思想: 1.冒泡排序(Bubble Sort)是一种计算机科学领域的较简单的排序算法. 2.它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小.首字母从从Z到 ...

  4. 冒泡排序java代码_数据结构与算法—冒泡排序(Java实现)

    [toc] 冒泡排序 程序代码 package com.uplooking.bigdata.datastructure; import java.util.Arrays; public class B ...

  5. 冒泡排序--Java

    1.冒泡排序 import java.util.Arrays; /*** 冒泡排序*/ public class Test01 {public static void main(String[] ar ...

  6. java冒泡测试代码,冒泡排序(java可直接跑,算法思想等小儿科不多说直接上代码)...

    import java.util.Arrays; /** *冒泡排序:时间复杂度O(N^2),空间复杂度O(1),稳定的排序 * 每趟确定一个元素的位置,所以需要arr.length趟排序, */ p ...

  7. 冒泡排序java代码_美团面试,我竟然输给了冒泡排序。。。

    前一阵子有个读者在微信里跟我聊了一件很有趣的事情,他去美团实习,面试让他哭笑不得,因为败在了冒泡排序上. 情况是这样子的,当时和面试官聊的感觉还可以,就在他觉得好像差不多快结束的时候,面试官给他扔了个 ...

  8. 冒泡排序java代码_面试官问我插入排序和冒泡排序哪个更牛逼?

    (给算法爱好者加星标,修炼编程内功) 来源:小鹿动画学编程,作者:小鹿同学 写在前边 排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的 ...

  9. 【冒泡排序Java版】

    Java冒泡排序 思路 :核心是每一轮都进行两两比较,大或小的往一边走,走完一轮就排好一个.走完所有的轮数后就有序了. public class 冒泡排序 {public static void ma ...

  10. java冒泡排序(java冒泡排序经典代码)

    java中最简单的方法冒泡排序? package bubble_sort; import java.util.Scanner; public class Sort { * 冒泡排序 * @param ...

最新文章

  1. 0.2 控制系统的状态空间表示法
  2. ubuntu系统中samba服务器搭建
  3. 机器学习 —— python库 —— 使用array创建
  4. 洛谷 - P1714 切蛋糕(单调队列+前缀和+思维)
  5. ajax获取数据用弹窗显示_Vue之 点击返回弹出推荐商品弹窗
  6. linux查看一小时之内的日志,linux – 在[timespan]内(例如最后一小时)查找日志文件中的条目...
  7. VXLAN 概念(Part II)- 每天5分钟玩转 OpenStack(109)
  8. CTS(10)---谷歌CTS测试之Verify简介
  9. apscheduler
  10. Android ScrollView嵌套ScrollView滚动的问题解决办法
  11. html5中点击后不发生变化_魔道祖师中资深粉一看就明白的梗,路人见到后都反应不过来...
  12. 【深度学习】ImageDataGenerator的使用--读书笔记
  13. Android定位地图导航——基于百度地图,实现自定义图标绘制并点击时弹出泡泡...
  14. c语言贪吃蛇自动移动,C语言贪吃蛇移动
  15. java使用手册_java配置使用手册
  16. C#Winform使用火狐firefox内核GeckoWebBrowser
  17. 三层交换机配置实现不同网络互通
  18. kaggle论文阅读
  19. 如何给未来的自己写一封信(邮件) -- 方法
  20. Blender 3.5 面的操作(二)

热门文章

  1. Vb自动读取本地HTML,VB读取网页内容 方法汇总 - mystic的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  2. 0基础参加数学建模,最大程度冲击奖项
  3. 不能说のsecret 5
  4. python发邮件smtplib+mail
  5. 软路由ros(MIKROTIK)安装教程:[11]端口映射
  6. 计算机系毕业论文ppt模板,计算机专业答辩PPT模板.ppt
  7. JAVA看云判断天气_看云,能否“识”天气?
  8. 【STM32技巧】使用STM32 HAL库的硬件I2C驱动RX8025T实时时钟芯片
  9. The RSpec Book笔记《二》Describing Features描述功能
  10. 矩阵迹(trace), 行列式(determinate)