为什么冒泡排序是稳定的?

简介: 为什么冒泡排序是稳定的?

下面是使用Java实现冒泡排序的源代码,每一行都有详细的注释来解释代码的功能和处理边界情况。我还会在后面解释为什么冒泡排序是稳定的。


public class BubbleSort {
    // 冒泡排序方法
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        // 遍历数组元素
        for (int i = 0; i < n - 1; i++) {
            // 标记是否有交换操作
            boolean swapped = false;
            // 每次遍历将最大的元素移动到最后
            for (int j = 0; j < n - i - 1; j++) {
                // 如果前面的元素比后面的元素大,则进行交换
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                    swapped = true;
                }
            }
            // 如果在一次遍历中没有进行交换操作,说明数组已经有序,可以提前结束排序
            if (!swapped) {
                break;
            }
        }
    }
    // 交换数组中的两个元素
    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    // 打印数组元素
    private static void printArray(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
    public static void main(String[] args) {
        int[] arr = {64, 34, 25, 12, 22, 11, 90};
        System.out.println("原始数组:");
        printArray(arr);
        bubbleSort(arr);
        System.out.println("排序后的数组:");
        printArray(arr);
    }
}


以上代码实现了冒泡排序算法,现在让我们逐行解释代码的功能和处理边界情况。


public class BubbleSort {
    // 冒泡排序方法
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        // 遍历数组元素
        for (int i = 0; i < n - 1; i++) {
            // 标记是否有交换操作
            boolean swapped = false;
            // 每次遍历将最大的元素移动到最后
            for (int j = 0; j < n - i - 1; j++) {
                // 如果前面的元素比后面的元素大,则进行交换
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                    swapped = true;
                }
            }
            // 如果在一次遍历中没有进行交换操作,说明数组已经有序,可以提前结束排序
            if (!swapped) {
                break;
            }
        }
    }
    // 交换数组中的两个元素
    private static
 void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    // 打印数组元素
    private static void printArray(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
    public static void main(String[] args) {
        int[] arr = {64, 34, 25, 12, 22, 11, 90};
        System.out.println("原始数组:");
        printArray(arr);
        bubbleSort(arr);
        System.out.println("排序后的数组:");
        printArray(arr);
    }
}



现在,让我们解释为什么冒泡排序是稳定的。


冒泡排序算法是通过比较相邻的元素并交换它们的位置来排序数组的算法。在每次遍历中,将最大的元素冒泡到最后的位置。由于每次比较的是相邻元素,所以对于相同的元素,它们之间的相对顺序不会改变。


考虑以下情况:


假设有一个数组 arr = {5, 2, 8, 2, 5},其中有两个相同的元素 2 和 5。


首先,第一个遍历将最大的元素 8 冒泡到最后,数组变为 {2, 5, 2, 5, 8}。


在第二次遍历中,比较和交换的过程如下:


比较 arr[0] 和 arr[1],不需要交换。

比较 arr[1] 和 arr[2],不需要交换。

比较 arr[2] 和 arr[3],需要交换,数组变为 {2, 2, 5, 5, 8}。

最后一次遍历时,不需要进行任何交换操作,数组保持不变。


所以,无论相同元素的相对顺序如何,冒泡排序都会保持它们的相对顺序不变。这就是为什么冒泡排序是稳定的。


冒泡排序的时间复杂度为O(n^2),其中n是待排序数组的长度。尽管冒泡排序不是最高效的排序算法,但由于其简单性和稳定性,它在某些特定情况下仍然是一个实用的选择。

相关文章
|
1月前
|
搜索推荐 算法
冒泡排序的效率的优化
冒泡排序的效率的优化
12 0
|
2月前
|
存储 搜索推荐 算法
如何优化插入排序的性能?
如何优化插入排序的性能?
14 0
|
6月前
|
搜索推荐 算法 Java
为什么冒泡排序是稳定的?
为什么冒泡排序是稳定的?
61 1
|
3月前
|
存储 算法
快速排序:非递归的优势与性能详解
快速排序:非递归的优势与性能详解
27 1
|
4月前
|
搜索推荐 算法 调度
堆排序:高效而稳定的排序算法
在计算机科学中,排序算法是一项基本而重要的任务。堆排序作为一种经典的排序算法,以其高效性和稳定性而受到广泛关注。本文将介绍堆排序的原理、实现方法以及其在实际应用中的优势。
|
5月前
|
搜索推荐
21 常见排序算法效率比较
21 常见排序算法效率比较
29 0
|
6月前
|
机器学习/深度学习 人工智能 算法
快速排序的实现和优化~
快速排序的实现和优化~
|
9月前
|
存储 搜索推荐 Shell
“希尔排序:打破时间瓶颈的排序算法 “
“希尔排序:打破时间瓶颈的排序算法 “
62 0
|
10月前
|
搜索推荐 索引
什么是排序算法的稳定性?
什么是排序算法的稳定性?
110 0
BXA
|
11月前
|
存储 机器学习/深度学习 人工智能
漫谈排序算法及其优化方案
在计算机科学中,排序算法(Sorting Algorithm)是一种将一组数据按照指定顺序进行排列的算法。 通常情况下,这种指定的顺序是由一个*排序关键字*所决定的,例如,按照学生的考试成绩排序,或者按照工资大小排序等
BXA
52 0