冒泡排序(Java)
冒泡排序(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,10,20
第三趟排序:
(1)-1,3,9,10,20
(2)-1,3,9,10,20
第四趟排序:
(1)-1,3,9,10,20
小结:
(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)相关推荐
- 冒泡排序(java实现)
冒泡排序,就是每次遍历都会把最小(或者最大)的数放在前面.比如要升序{A1,........An} 第一次排序要取出整个数组中最小放在A1的位置,从An开始往前遍历,相邻两个数比较,如果Aj < ...
- 冒泡排序java代码_看动画学算法之:排序冒泡排序
点击上方的蓝字关注我吧 程序那些事 简介 排序可能是所有的算法中最最基础和最最常用的了.排序是一个非常经典的问题,它以一定的顺序对一个数组(或一个列表)中的项进行重新排序. 排序算法有很多种,每个都有 ...
- 冒泡排序 java_冒泡排序Java版本
一.冒泡排序的基本思想: 1.冒泡排序(Bubble Sort)是一种计算机科学领域的较简单的排序算法. 2.它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小.首字母从从Z到 ...
- 冒泡排序java代码_数据结构与算法—冒泡排序(Java实现)
[toc] 冒泡排序 程序代码 package com.uplooking.bigdata.datastructure; import java.util.Arrays; public class B ...
- 冒泡排序--Java
1.冒泡排序 import java.util.Arrays; /*** 冒泡排序*/ public class Test01 {public static void main(String[] ar ...
- java冒泡测试代码,冒泡排序(java可直接跑,算法思想等小儿科不多说直接上代码)...
import java.util.Arrays; /** *冒泡排序:时间复杂度O(N^2),空间复杂度O(1),稳定的排序 * 每趟确定一个元素的位置,所以需要arr.length趟排序, */ p ...
- 冒泡排序java代码_美团面试,我竟然输给了冒泡排序。。。
前一阵子有个读者在微信里跟我聊了一件很有趣的事情,他去美团实习,面试让他哭笑不得,因为败在了冒泡排序上. 情况是这样子的,当时和面试官聊的感觉还可以,就在他觉得好像差不多快结束的时候,面试官给他扔了个 ...
- 冒泡排序java代码_面试官问我插入排序和冒泡排序哪个更牛逼?
(给算法爱好者加星标,修炼编程内功) 来源:小鹿动画学编程,作者:小鹿同学 写在前边 排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的 ...
- 【冒泡排序Java版】
Java冒泡排序 思路 :核心是每一轮都进行两两比较,大或小的往一边走,走完一轮就排好一个.走完所有的轮数后就有序了. public class 冒泡排序 {public static void ma ...
- java冒泡排序(java冒泡排序经典代码)
java中最简单的方法冒泡排序? package bubble_sort; import java.util.Scanner; public class Sort { * 冒泡排序 * @param ...
最新文章
- 0.2 控制系统的状态空间表示法
- ubuntu系统中samba服务器搭建
- 机器学习 —— python库 —— 使用array创建
- 洛谷 - P1714 切蛋糕(单调队列+前缀和+思维)
- ajax获取数据用弹窗显示_Vue之 点击返回弹出推荐商品弹窗
- linux查看一小时之内的日志,linux – 在[timespan]内(例如最后一小时)查找日志文件中的条目...
- VXLAN 概念(Part II)- 每天5分钟玩转 OpenStack(109)
- CTS(10)---谷歌CTS测试之Verify简介
- apscheduler
- Android ScrollView嵌套ScrollView滚动的问题解决办法
- html5中点击后不发生变化_魔道祖师中资深粉一看就明白的梗,路人见到后都反应不过来...
- 【深度学习】ImageDataGenerator的使用--读书笔记
- Android定位地图导航——基于百度地图,实现自定义图标绘制并点击时弹出泡泡...
- c语言贪吃蛇自动移动,C语言贪吃蛇移动
- java使用手册_java配置使用手册
- C#Winform使用火狐firefox内核GeckoWebBrowser
- 三层交换机配置实现不同网络互通
- kaggle论文阅读
- 如何给未来的自己写一封信(邮件) -- 方法
- Blender 3.5 面的操作(二)
热门文章
- Vb自动读取本地HTML,VB读取网页内容 方法汇总 - mystic的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- 0基础参加数学建模,最大程度冲击奖项
- 不能说のsecret 5
- python发邮件smtplib+mail
- 软路由ros(MIKROTIK)安装教程:[11]端口映射
- 计算机系毕业论文ppt模板,计算机专业答辩PPT模板.ppt
- JAVA看云判断天气_看云,能否“识”天气?
- 【STM32技巧】使用STM32 HAL库的硬件I2C驱动RX8025T实时时钟芯片
- The RSpec Book笔记《二》Describing Features描述功能
- 矩阵迹(trace), 行列式(determinate)