实现冒泡排序
字数 858 2025-10-27 22:21:03

实现冒泡排序

题目描述:给定一个整数数组,使用冒泡排序算法将其按升序排列。冒泡排序通过重复遍历数组,比较相邻元素,如果顺序错误就交换它们,直到没有需要交换的元素为止。

解题过程:

  1. 基本思想:冒泡排序的核心是"冒泡"过程——每一轮遍历将当前未排序部分的最大元素"浮"到正确位置(数组末尾)。通过多次遍历,逐步将较小元素向前移动,较大元素向后移动。

  2. 算法步骤

    • 步骤1:从数组第一个元素开始,比较相邻的两个元素(索引j和j+1)
    • 步骤2:如果前一个元素大于后一个元素(arr[j] > arr[j+1]),则交换它们的位置
    • 步骤3:向右移动一位,重复步骤1-2,直到遍历到未排序部分的末尾
    • 步骤4:每完成一轮遍历,最大元素就会"冒泡"到正确位置,排序范围缩小一位
    • 步骤5:重复上述过程,直到整个数组有序
  3. 详细演示(以数组[5, 2, 8, 1, 9]为例):

    第一轮遍历:

    • 比较5和2:5>2,交换 → [2,5,8,1,9]
    • 比较5和8:5<8,不交换 → [2,5,8,1,9]
    • 比较8和1:8>1,交换 → [2,5,1,8,9]
    • 比较8和9:8<9,不交换 → [2,5,1,8,9]
    • 第一轮结束,最大值9已到位

    第二轮遍历(处理前4个元素):

    • 比较2和5:2<5,不交换 → [2,5,1,8,9]
    • 比较5和1:5>1,交换 → [2,1,5,8,9]
    • 比较5和8:5<8,不交换 → [2,1,5,8,9]
    • 第二轮结束,次大值8已到位

    第三轮遍历(处理前3个元素):

    • 比较2和1:2>1,交换 → [1,2,5,8,9]
    • 比较2和5:2<5,不交换 → [1,2,5,8,9]
    • 第三轮结束,数组已有序
  4. 优化技巧:可以设置标志位记录是否发生交换,如果某一轮没有发生任何交换,说明数组已有序,可提前结束排序。

  5. 复杂度分析

    • 时间复杂度:最好情况O(n)(已有序),最坏和平均情况O(n²)
    • 空间复杂度:O(1)(原地排序)
    • 稳定性:稳定(相等元素不交换)
实现冒泡排序 题目描述:给定一个整数数组,使用冒泡排序算法将其按升序排列。冒泡排序通过重复遍历数组,比较相邻元素,如果顺序错误就交换它们,直到没有需要交换的元素为止。 解题过程: 基本思想 :冒泡排序的核心是"冒泡"过程——每一轮遍历将当前未排序部分的最大元素"浮"到正确位置(数组末尾)。通过多次遍历,逐步将较小元素向前移动,较大元素向后移动。 算法步骤 : 步骤1:从数组第一个元素开始,比较相邻的两个元素(索引j和j+1) 步骤2:如果前一个元素大于后一个元素(arr[ j] > arr[ j+1 ]),则交换它们的位置 步骤3:向右移动一位,重复步骤1-2,直到遍历到未排序部分的末尾 步骤4:每完成一轮遍历,最大元素就会"冒泡"到正确位置,排序范围缩小一位 步骤5:重复上述过程,直到整个数组有序 详细演示 (以数组[ 5, 2, 8, 1, 9 ]为例): 第一轮遍历: 比较5和2:5>2,交换 → [ 2,5,8,1,9 ] 比较5和8:5<8,不交换 → [ 2,5,8,1,9 ] 比较8和1:8>1,交换 → [ 2,5,1,8,9 ] 比较8和9:8<9,不交换 → [ 2,5,1,8,9 ] 第一轮结束,最大值9已到位 第二轮遍历(处理前4个元素): 比较2和5:2<5,不交换 → [ 2,5,1,8,9 ] 比较5和1:5>1,交换 → [ 2,1,5,8,9 ] 比较5和8:5<8,不交换 → [ 2,1,5,8,9 ] 第二轮结束,次大值8已到位 第三轮遍历(处理前3个元素): 比较2和1:2>1,交换 → [ 1,2,5,8,9 ] 比较2和5:2<5,不交换 → [ 1,2,5,8,9 ] 第三轮结束,数组已有序 优化技巧 :可以设置标志位记录是否发生交换,如果某一轮没有发生任何交换,说明数组已有序,可提前结束排序。 复杂度分析 : 时间复杂度:最好情况O(n)(已有序),最坏和平均情况O(n²) 空间复杂度:O(1)(原地排序) 稳定性:稳定(相等元素不交换)