java-冒泡排序 1

Java中的冒泡排序

1. 冒泡排序的基本概念

冒泡排序(Bubble Sort)是一种简单且直观的排序算法。它通过重复地遍历待排序的列表,比较相邻的元素并交换它们的位置,使较大的元素逐步从列表的一端移动到另一端,就像气泡在水中上升一样。冒泡排序的核心思想是逐步将最大的元素"冒泡"到列表的末尾。

2. 冒泡排序的工作原理

冒泡排序通过多次遍历列表,每次遍历将相邻的两个元素进行比较,如果顺序错误就交换它们。每次完整的遍历后,最大的元素会被移动到列表的末尾。这个过程会重复进行,直到整个列表有序为止。

2.1 示例

假设有一个待排序的数组`[5, 3, 8, 4, 2]`,冒泡排序的过程如下:

  • 初始状态:[5, 3, 8, 4, 2]

  • 第一次遍历:

  • 比较5和3,交换,数组变为:[3, 5, 8, 4, 2]

  • 比较5和8,不交换,数组不变:[3, 5, 8, 4, 2]

  • 比较8和4,交换,数组变为:[3, 5, 4, 8, 2]

  • 比较8和2,交换,数组变为:[3, 5, 4, 2, 8]

  • 第二次遍历:

  • 比较3和5,不交换,数组不变:[3, 5, 4, 2, 8]

  • 比较5和4,交换,数组变为:[3, 4, 5, 2, 8]

  • 比较5和2,交换,数组变为:[3, 4, 2, 5, 8]

  • 比较5和8,不交换,数组不变:[3, 4, 2, 5, 8]

  • 第三次遍历:

  • 比较3和4,不交换,数组不变:[3, 4, 2, 5, 8]

  • 比较4和2,交换,数组变为:[3, 2, 4, 5, 8]

  • 比较4和5,不交换,数组不变:[3, 2, 4, 5, 8]

  • 比较5和8,不交换,数组不变:[3, 2, 4, 5, 8]

  • 第四次遍历:

  • 比较3和2,交换,数组变为:[2, 3, 4, 5, 8]

  • 比较3和4,不交换,数组不变:[2, 3, 4, 5, 8]

  • 比较4和5,不交换,数组不变:[2, 3, 4, 5, 8]

  • 比较5和8,不交换,数组不变:[2, 3, 4, 5, 8]

经过四次遍历后,数组已经有序:[2, 3, 4, 5, 8]。

3. 冒泡排序的实现

在Java中实现冒泡排序非常简单,可以通过嵌套的`for`循环来实现。

3.1 基本实现

```java

public class BubbleSort {

public static void bubbleSort(int[] array) {

int n = array.length;

for (int i = 0; i < n - 1; i++) {

for (int j = 0; j < n - 1 - i; j++) {

if (array[j] > array[j + 1]) {

// 交换array[j]和array[j + 1]

int temp = array[j];

array[j] = array[j + 1];

array[j + 1] = temp;

}

}

}

}

public static void main(String[] args) {

int[] array = {5, 3, 8, 4, 2};

bubbleSort(array);

System.out.println("Sorted array:");

for (int i : array) {

System.out.print(i + " ");

}

}

}

```

在这个实现中,外层循环控制遍历的次数,内层循环用于比较和交换相邻的元素。每次内层循环结束后,最大的元素被移动到列表的末尾。

4. 优化冒泡排序

冒泡排序的效率不高,尤其是在处理较大数据集时。可以通过一些优化来提高其性能。

4.1 提前终止

如果在某次遍历中没有发生任何交换,说明数组已经有序,可以提前终止排序。

```java

public class OptimizedBubbleSort {

public static void bubbleSort(int[] array) {

int n = array.length;

boolean swapped;

for (int i = 0; i < n - 1; i++) {

swapped = false;

for (int j = 0; j < n - 1 - i; j++) {

if (array[j] > array[j + 1]) {

// 交换array[j]和array[j + 1]

int temp = array[j];

array[j] = array[j + 1];

array[j + 1] = temp;

swapped = true;

}

}

// 如果没有交换发生,提前终止

if (!swapped) break;

}

}

public static void main(String[] args) {

int[] array = {5, 3, 8, 4, 2};

bubbleSort(array);

System.out.println("Sorted array:");

for (int i : array) {

System.out.print(i + " ");

}

}

}

```

5. 冒泡排序的时间复杂度

冒泡排序的时间复杂度取决于输入数据的初始顺序。

  • 最好情况:当数组已经有序时,只需要进行一次遍历即可终止,时间复杂度为O(n)。

  • 最坏情况:当数组完全逆序时,需要进行n-1次遍历,时间复杂度为O(n^2)。

  • 平均情况:时间复杂度为O(n^2)。

冒泡排序的空间复杂度为O(1),因为它只需要常数级别的额外空间用于交换元素。

6. 冒泡排序的稳定性

冒泡排序是一个稳定的排序算法,即如果两个元素相等,它们在排序后的相对顺序不会改变。这是因为冒泡排序在交换元素时,只会交换相邻的元素,不会跨过其他相等的元素。

7. 冒泡排序的适用场景

由于冒泡排序的时间复杂度较高,它通常不适用于大型数据集的排序。然而,冒泡排序的实现非常简单,因此在某些简单或特定的场景下仍然可以使用,例如:

  • 学习和教学:冒泡排序是许多初学者学习排序算法的入门算法。

  • 小型数据集:对于非常小的数据集,冒泡排序的性能尚可。

  • 数据近乎有序:如果数据集大部分已经有序,冒泡排序的优化版本可以高效地完成排序。

8. 冒泡排序的可视化

为了更好地理解冒泡排序的工作原理,可以将排序过程进行可视化。以下是一个简单的示例,展示了如何通过打印每次遍历后的数组状态来可视化排序过程。

```java

public class VisualBubbleSort {

public static void bubbleSort(int[] array) {

int n = array.length;

for (int i = 0; i < n - 1; i++) {

for (int j = 0; j < n - 1 - i; j++) {

if (array[j] > array[j + 1]) {

// 交换array[j]和array[j + 1]

int temp = array[j];

array[j] = array[j + 1];

array[j + 1] = temp;

}

}

// 打印当前状态

printArray(array);

}

}

public static void printArray(int[] array) {

for (int i : array) {

System.out.print(i + " ");

}

System.out.println();

}

public static void main(String[] args) {

int[] array = {5, 3, 8, 4, 2};

bubbleSort(array);

System.out.println("Sorted array:");

printArray(array);

}

}

```

在这个示例中,每次内层循环结束后,数组的当前状态会被打印出来,帮助我们直观地观察排序过程。

相关推荐
强盛小灵通专卖员1 小时前
分类分割详细指标说明
人工智能·深度学习·算法·机器学习
IT猿手4 小时前
基于强化学习 Q-learning 算法求解城市场景下无人机三维路径规划研究,提供完整MATLAB代码
神经网络·算法·matlab·人机交互·无人机·强化学习·无人机三维路径规划
熊大如如7 小时前
Java 反射
java·开发语言
猿来入此小猿7 小时前
基于SSM实现的健身房系统功能实现十六
java·毕业设计·ssm·毕业源码·免费学习·猿来入此·健身平台
万能程序员-传康Kk7 小时前
旅游推荐数据分析可视化系统算法
算法·数据分析·旅游
PXM的算法星球8 小时前
【并发编程基石】CAS无锁算法详解:原理、实现与应用场景
算法
ll7788118 小时前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
烨然若神人~8 小时前
算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
算法
爱coding的橙子8 小时前
每日算法刷题Day2 5.10:leetcode数组1道题3种解法,用时40min
算法·leetcode
Akiiiira8 小时前
【数据结构】栈
数据结构