java冒泡排序从小到大

admin 14 0

### Java中实现冒泡排序(从小到大)

在Java中,冒泡排序是一种简单直观的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来,遍历数列的工作是重复进行的,直到没有再需要交换的元素为止,这意味着数列已经排序完成,冒泡排序的名字由来是因为越小的元素会经过交换慢慢“浮”到数列的顶端(即从小到大排序),就如同水中的气泡一样上升到水面。

#### 答案

Java中实现冒泡排序(从小到大)的基本思路是:通过双重循环遍历数组,外层循环控制排序的轮数,内层循环负责在每一轮中进行相邻元素的比较和可能的交换,每一轮排序后,最大的元素会被“冒泡”到它应该在的位置(即数组的末尾),因此每完成一轮排序,下一轮排序时就可以少比较一次(因为最大的元素已经就位)。

#### Java代码实现

下面是一个Java中实现冒泡排序(从小到大)的示例代码:

public class BubbleSort {

    /**
     * 冒泡排序算法实现
     * @param arr 需要排序的数组
     */
    public static void bubbleSort(int[] arr) {
        if (arr == null || arr.length <= 1) {
            return; // 如果数组为空或只有一个元素,则无需排序
        }
        
        int n = arr.length;
        boolean swapped; // 用于标记一轮排序中是否发生了交换
        
        // 外层循环控制排序的轮数
        for (int i = 0; i < n - 1; i++) {
            swapped = false; // 每轮开始前重置swapped为false
            
            // 内层循环负责在每一轮中进行相邻元素的比较和可能的交换
            for (int j = 0; j < n - 1 - i; j++) {
                // 如果当前元素大于下一个元素,则交换它们
                if (arr[j] > arr[j + 1]) {
                    // 交换arr[j]和arr[j+1]
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    
                    // 标记发生了交换
                    swapped = true;
                }
            }
            
            // 如果一轮排序中没有发生任何交换,说明数组已经有序,可以提前结束排序
            if (!swapped) {
                break;
            }
        }
    }

    /**
     * 主函数,用于测试冒泡排序
     * @param args 命令行参数
     */
    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);
    }

    /**
     * 打印数组的方法
     * @param arr 需要打印的数组
     */
    public static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}

#### 代码解析

1. **方法定义**:`bubbleSort(int[] arr)` 方法接收一个整型数组作为参数,对其进行冒泡排序。

2. **边界条件检查**:首先检查数组是否为空或只有一个元素,如果是,则无需排序,直接返回。

3. **排序过程**:

- 使用外层循环控制排序的轮数,从0开始到`n-2`(因为最后一轮排序后,最大的元素已经在最后一位,无需再比较)。

- 内层循环负责在每一轮中进行相邻元素的比较和可能的交换,随着排序的进行,每一轮排序后,最大的元素已经就位,因此内层循环的比较次数可以减少(`n-1-i`)。

- 使用`swapped`变量来标记一轮排序中是否发生了交换,如果在某一轮排序中没有发生任何交换,说明数组已经有序,可以提前结束排序。

4. **交换元素**:如果当前元素大于下一个元素,则交换它们的位置。

5. **测试**:`main` 方法中创建了一个测试数组,并调用`bubbleSort`方法进行排序,最后打印排序前后的数组以验证排序结果。

#### 冒泡排序的性能

冒泡排序的平均时间复杂度和最坏时间复杂度都是O(n^2),其中