图解Java经典算法冒泡排序的原理与实现

作者:Binaire-沐辰 时间:2023-03-14 21:41:23 

冒泡排序

冒泡排序是一种比较简单的排序算法,我们可以重复遍历要排序的序列,每次比较两个元素,如果他们顺序错误就交换位置,重复遍历到没有可以交换的元素,说明排序完成。

算法原理

  • 从第一个元素开始,比较相邻的两个元素,如果第一个大于第二个,则交换它们

  • 对每一对相邻的元素做相同的操作,从第一对到最后一对,最终最后一位元素就是最大值

  • 对每一个元素重复上述步骤,最后一个除外 

动图演示

图解Java经典算法冒泡排序的原理与实现

算法练习

题目描述: 给定一个无序数组,利用冒泡排序将数组按升序排列。

示例一:

输入: arrs= [5,0,9,3,-1,12]
输出: arrs= [-1,0,3,5,9,12]

示例二:

输入: arrs= [3,5,9,7,2,1]
输出: arrs= [1,2,3,5,7,9]

解题思路:

通过比较相邻的元素,如果前一个比后一个大,则交换位置。

  • 第一趟:比较第1个和第2个元素,然后是第2个和第3个比较,这样直到倒数第2个和最后1个,将最大的数移动到最后一位。

  • 第二趟:重复上面步骤,将第二大的数交换至倒数第二位。

…

  • 每一趟都会将元素中第 n 大的元素交换到倒数第 n 位。

  • 一共需要n-1趟。

代码实现:

public class BubbleTest {
   public static void main(String[] args) {
       Integer[] arr = {3,5,9,7,2,1};
       Bubble.sort(arr);
       System.out.println(Arrays.toString(arr));
   }
   //数组排序
   public static void bubblesort(Comparable[] a){
       for (int i = a.length - 1;i > 0;i--){
           for (int j = 0;j < i;j++){
               if (greater(a[j],a[j + 1])){
                   swap(a,j,j + 1);
               }
           }
       }
   }
   //比较 v 是否大于 w
   public static boolean greater(Comparable v,Comparable w){
       return v.compareTo(w) > 0;
   }
   //数组元素交换位置
   private static void swap(Comparable[] a,int i,int j){
       Comparable temp;
       temp = a[i];
       a[i] = a[j];
       a[j] = temp;
   }
}

算法分析

时间复杂度

冒泡排序是一种用时间换空间的排序方法,最坏情况是把顺序的排列变成逆序,或者把逆序的数列变成顺序。在这种情况下,每一次比较都需要进行交换运算。

而对于有n个元素的数列它的比较次数为 (n-1) + (n-2) + &hellip; + 1 = n * (n - 1) / 2;因此它的时间复杂度为O(n^2)。

空间复杂度

冒泡排序的辅助变量只是一个临时变量,不会随数组规模的增大而增大,所以冒泡排序的空间复杂度为O(1)。

来源:https://binaire.blog.csdn.net/article/details/126298003

标签:Java,冒泡排序
0
投稿

猜你喜欢

  • SpringBoot 添加本地 jar 文件的操作步骤

    2022-03-09 21:36:11
  • C#文件上传的简单实现

    2021-06-02 19:06:04
  • Java编程之双重循环打印图形

    2022-02-01 22:06:37
  • Java 实战项目之精品养老院管理系统的实现流程

    2022-05-30 08:18:11
  • c#使用filesystemwatcher实时监控文件目录的添加和删除

    2021-12-04 18:01:57
  • java实现简单学生成绩管理系统

    2023-08-15 18:38:57
  • C++实现哈夫曼树算法

    2023-05-21 01:03:46
  • C# LINQ查询表达式及对应LAMBDA表达式的用法

    2023-07-31 19:15:26
  • Android7.0中关于ContentProvider组件详解

    2023-10-30 19:48:29
  • java字节码框架ASM的深入学习

    2023-11-29 05:51:19
  • SpringBoot整合mybatis常见问题(小结)

    2023-07-23 09:50:12
  • android中SQLite使用及特点

    2023-07-24 23:33:28
  • Spring Boot 实现配置文件加解密原理

    2023-11-23 17:48:46
  • 详解Java实现缓存(LRU,FIFO)

    2022-04-24 13:35:26
  • Winform实现将网页生成图片的方法

    2022-09-06 13:39:31
  • flutter 屏幕尺寸适配和字体大小适配的实现

    2022-06-10 06:54:49
  • Java基础知识精通二维数组的应用

    2022-02-03 03:01:28
  • Android WebView实现长按保存图片及长按识别二维码功能

    2021-08-18 18:56:09
  • JAVA JDK8 List分组的实现和用法

    2023-11-26 09:56:11
  • C#微信开发之获取接口调用凭据

    2023-10-28 07:57:54
  • asp之家 软件编程 m.aspxhome.com