一、代码基础准备
1. 平台:eclipse
2. 讲解参考(敲喜欢左程云!:【新手班】选择排序_哔哩哔哩_bilibili
3. 基础方法实现
// 根据maxLen和maxValue,生成对应长度的数组
public ArrayList<Integer> generateArr(int maxLen, int maxValue) {
ArrayList<Integer> arr = new ArrayList<Integer>();
Random random = new Random();
int min = 0, max = maxValue;
for(int i = 0; i < maxLen; i++) {
arr.add(random.nextInt(max - min + 1) + min);
}
return arr;
}
// 交换arr数组中两个位置
public void swap(ArrayList<Integer> arr, int index1, int index2) {
int temp = arr.get(index1);
arr.set(index1, arr.get(index2));
arr.set(index2, temp);
}
// 打印数组
public void printArr(ArrayList<Integer> arr) {
for(int i = 0; i < arr.size(); i++) {
System.out.print(arr.get(i) + " ");
}
System.out.println();
}
二、选择排序
1. 思想
对数组由左到右依次,
- 首先:对 0 - n-1 位置搜索(n为数组长度),选出最小值并将其与第0位交换;
- 第二步:对 1 - n-1 位置搜索,选出最小值并将其与第1位交换;
- ......
- 最后一步:对 n-2 - n-1位置搜索,选出最小值并将其与第n-1位交换;
- 此时数组为非降序排列。
2. 手撕代码
// 选择排序:由小到大
public void selectionSort(ArrayList<Integer> arr){
// 边界条件
if(arr == null || arr.size() <= 1) {
return;
}
// 主体
for(int i = 0; i < arr.size() - 1; i++) {
int temp_min = arr.get(i), minIndex = i;
for(int j = i+1; j < arr.size(); j++) {
if(arr.get(j) < temp_min) {
temp_min = arr.get(j);
minIndex = j;
}
}
swap(arr, i, minIndex);
}
}
实现结果:
![]()
![]()
可实现基础功能。
3. 改进空间
1. 在选择排序双重for循环中使用了两个变量:
- temp_min存储临时的最小值;
- minIndex存储最小值对应索引。
但其实二者存在如下关系,可相互表示,故只需要一个变量即可。
temp_min = arr.get(minIndex);
2. if 比较语言可用三元运算符代替,更加简洁。
改进后代码:
// 选择排序:由小到大
public void selectionSort(ArrayList<Integer> arr){
// 边界条件
if(arr == null || arr.size() <= 1) {
return;
}
// 主体
for(int i = 0; i < arr.size() - 1; i++) {
int minIndex = i; // 1个变量即可
for(int j = i+1; j < arr.size(); j++) {
minIndex = arr.get(j) < arr.get(minIndex) ? j : minIndex; // 更简洁
}
swap(arr, i, minIndex);
}
}
4. 注意事项
- 尽量少使用冗余变量;
- 简化代码及效率;
- 注意算法边界条件:本算法中边界条件是数组长度为0或1,此时直接返回。
三、冒泡排序
1. 思想
对数组从 0 到 n-1(n为数组长度),依次比较该位与下一位的大小,每两位都保证将大数放在后面。
- 第1次循环:保证第 n-1 位(最后一位)是最大值;
- 第2次循环:保证第 n-2 位是前 n-2范围的最大值;
- ......
- 第n-1次循环:保证第2位是前2范围的最大值;
- 结束,此时数组为非降序排列。
2. 手撕代码
// 冒泡排序
public void bubbleSort(ArrayList<Integer> arr) {
// 边界条件
if(arr == null || arr.size() <= 1) {
return;
}
// 主体
for(int endIndex = arr.size()-1; endIndex > 0; endIndex--) {
for(int j = 0; j < endIndex; j++) {
if(arr.get(j) > arr.get(j + 1)) {
swap(arr, j, j + 1);
}
}
}
}
结果:

本文介绍了在Eclipse平台上实现的选择排序、冒泡排序和插入排序的基本方法,包括代码示例和优化建议。作者通过手撕代码展示了算法步骤,并强调了简化代码和考虑边界条件的重要性。
593

被折叠的 条评论
为什么被折叠?



