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);

}

}

```

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

相关推荐
ROBIN__dyc4 分钟前
表达式
算法
无限大.5 分钟前
c语言200例 067
java·c语言·开发语言
余炜yw6 分钟前
【Java序列化器】Java 中常用序列化器的探索与实践
java·开发语言
攸攸太上6 分钟前
JMeter学习
java·后端·学习·jmeter·微服务
无限大.7 分钟前
c语言实例
c语言·数据结构·算法
Kenny.志9 分钟前
2、Spring Boot 3.x 集成 Feign
java·spring boot·后端
六点半88811 分钟前
【C++】速通涉及 “vector” 的经典OJ编程题
开发语言·c++·算法·青少年编程·推荐算法
不修×蝙蝠12 分钟前
八大排序--01冒泡排序
java
@haihi20 分钟前
冒泡排序,插入排序,快速排序,选择排序
数据结构·算法·排序算法
quaer23 分钟前
Open-Sora全面开源?
开发语言·算法·机器学习·matlab·矩阵