在编程学习中,排序算法与查找算法是每个开发者必须掌握的基础知识。本文将通过Java代码实现冒泡排序、选择排序、快速排序(内置)三种经典算法,并手写二分查找,最后进行综合应用演示。
一、算法实现与解析
1. 冒泡排序:相邻元素两两比较
// 冒泡排序优化版(添加交换标志位)
public static void bubbleSort(int[] arr) {
boolean swapped;
for (int i = 0; i < arr.length-1; i++) {
swapped = false;
for (int j = 0; j < arr.length-i-1; j++) {
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
swapped = true;
}
}
if (!swapped) break; // 提前终止已有序的情况
}
}
`
算法特点:
-
时间复杂度:O(n²)(最坏情况)
-
空间复杂度:O(1)
-
稳定排序算法
-
优化后对已有序数组效率提升明显
2. 选择排序:定位最小元素
// 改进版选择排序(减少交换次数)
public static void selectionSort(int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
int minIndex = i;
for (int j = i+1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
算法特点:
-
时间复杂度:O(n²)
-
空间复杂度:O(1)
-
不稳定排序算法
-
交换次数比冒泡排序少
3. 二分查找:高效搜索利器
public static int binarySearch(int target, int[] sortedArr) {
int left = 0;
int right = sortedArr.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2; // 防止整数溢出
if (sortedArr[mid] == target) {
return mid;
} else if (sortedArr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 未找到标识
}
使用条件:
-
必须是有序数组
-
时间复杂度:O(log n)
二、综合应用示例
public static void main(String[] args) {
int[] data = {10, 24, 3, 45, 5, 1};
// 冒泡排序演示
int[] bubbleData = Arrays.copyOf(data, data.length);
bubbleSort(bubbleData);
System.out.println("冒泡排序结果:" + Arrays.toString(bubbleData));
// 选择排序演示
int[] selectData = Arrays.copyOf(data, data.length);
selectionSort(selectData);
System.out.println("选择排序结果:" + Arrays.toString(selectData));
// 快速排序(内置)
int[] quickData = Arrays.copyOf(data, data.length);
Arrays.sort(quickData);
System.out.println("快速排序结果:" + Arrays.toString(quickData));
// 二分查找演示
int target = 45;
int index = binarySearch(target, quickData);
System.out.printf("数字 %d 的位置:%s%n",
target, index >= 0 ? index : "未找到");
}
输出结果:
冒泡排序结果:[1, 3, 5, 10, 24, 45]
选择排序结果:[1, 3, 5, 10, 24, 45]
快速排序结果:[1, 3, 5, 10, 24, 45]
数字 45 的位置:5
三、算法对比与选择建议
算法 | 平均时间复杂度 | 空间复杂度 | 稳定性 | 适用场景 |
---|---|---|---|---|
冒泡排序 | O(n²) | O(1) | 稳定 | 小规模数据、教学演示 |
选择排序 | O(n²) | O(1) | 不稳定 | 交换成本高的场景 |
快速排序 | O(n log n) | O(log n) | 不稳定 | 通用场景、大规模数据 |
二分查找 | O(log n) | O(1) | - | 有序数据快速检索 |
开发建议:
-
实际开发中优先使用
Arrays.sort()
,其采用优化后的Timsort算法 -
二分查找需确保数组已排序
-
理解算法原理比死记代码更重要
四、学习心得
通过手写这些经典算法,可以加深对以下编程思想的理解:
-
分治思想:快速排序的划分过程
-
减治思想:二分查找的区间缩小策略
-
空间换时间:不同算法的时间/空间权衡
建议读者可以尝试以下扩展练习:
-
实现降序排序版本
-
添加可视化排序过程
-
实现递归版二分查找
本文代码已通过测试,可直接复制到IDE中运行。如果觉得有帮助,欢迎点赞收藏关注三连,有任何问题欢迎在评论区交流讨论!