实现冒泡排序
字数 858 2025-10-27 22:21:03
实现冒泡排序
题目描述:给定一个整数数组,使用冒泡排序算法将其按升序排列。冒泡排序通过重复遍历数组,比较相邻元素,如果顺序错误就交换它们,直到没有需要交换的元素为止。
解题过程:
-
基本思想:冒泡排序的核心是"冒泡"过程——每一轮遍历将当前未排序部分的最大元素"浮"到正确位置(数组末尾)。通过多次遍历,逐步将较小元素向前移动,较大元素向后移动。
-
算法步骤:
- 步骤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)(原地排序)
- 稳定性:稳定(相等元素不交换)