java冒泡排序stream
时间: 2025-05-28 22:52:28 浏览: 13
### 使用 Java Stream API 实现冒泡排序
尽管传统的冒泡排序通常通过嵌套循环来实现,但可以通过结合 `Stream` 和自定义逻辑的方式间接模拟这一过程。需要注意的是,`Stream` 是一种声明式的操作工具,主要用于数据处理而不是直接修改原始数组。因此,为了保持一致性并满足需求,可以采用以下方法。
以下是基于 `Stream` 的冒泡排序实现:
```java
import java.util.*;
import java.util.stream.*;
public class BubbleSortWithStream {
public static List<Integer> bubbleSort(List<Integer> list) {
if (list == null || list.isEmpty()) {
return Collections.emptyList();
}
// 创建副本以避免修改原列表
List<Integer> sortedList = new ArrayList<>(list);
IntStream.range(0, sortedList.size() - 1).forEach(i -> {
Boolean sortedFlag = false;
IntStream.range(0, sortedList.size() - i - 1)
.filter(j -> sortedList.get(j) > sortedList.get(j + 1))
.forEach(j -> {
Collections.swap(sortedList, j, j + 1);
sortedFlag = true;
});
if (!sortedFlag) {
return; // 如果本轮未发生交换,则提前结束
}
});
return sortedList;
}
public static void main(String[] args) {
List<Integer> unsortedList = Arrays.asList(10, 7, 5, 6, 4, 8, 1, 3, 2, 9);
List<Integer> sortedList = bubbleSort(unsortedList);
System.out.println("Sorted List: " + sortedList);
}
}
```
#### 解析
1. **输入验证**
首先检查传入的列表是否为空或为 `null`,如果是则返回一个空列表[^1]。
2. **创建副本**
为了避免直接修改原始列表,创建了一个新的可变列表作为工作区[^2]。
3. **外层迭代**
利用 `IntStream.range` 构建外部索引范围,控制每一轮比较的最大次数[^3]。
4. **内层过滤与交换**
内部再次使用 `IntStream.range` 来定位需要交换的位置,并通过条件筛选 (`filter`) 找出逆序对。一旦发现逆序对,立即调用 `Collections.swap` 进行位置互换[^4]。
5. **优化标志位**
设置布尔变量 `sortedFlag` 记录当前轮次是否有任何交换动作。如果没有发生交换,则说明序列已完全有序,可以直接退出循环[^5]。
---
### 注意事项
- 虽然此版本引入了 `Stream` 技术用于构建索引集合,但它本质上仍然是传统冒泡排序的一种变形形式。
- 对于大规模数据集而言,这种做法可能不如其他更高效的算法(如快速排序、归并排序等)表现优越[^6]。
---
阅读全文
相关推荐


















