第1课_选择排序法
热度🔥:25 免费课程
授课语音
选择排序法
1. 选择排序算法简介
1.1 选择排序的基本概念
选择排序(Selection Sort)是一种简单的排序算法。它的基本思想是每一次从待排序的元素中选择出最小(或最大)的元素,将其放到已排序序列的末尾。该算法的基本过程是:
- 在待排序的数组中找到最小的元素。
- 将这个最小的元素与数组的第一个元素交换位置。
- 接着在剩余未排序的元素中找到最小的元素,与第二个元素交换位置。
- 重复此过程,直到所有元素都排好序。
选择排序的时间复杂度是 O(n²),因为它需要两层嵌套的循环:外层循环控制排序的次数,内层循环找到当前未排序部分的最小元素。
1.2 选择排序的特点
- 稳定性:选择排序是一种不稳定的排序算法。因为在排序过程中,当最小元素与当前元素交换时,如果有相同的元素,它们的相对顺序可能会改变。
- 时间复杂度:选择排序的时间复杂度为 O(n²),即随着输入数据的增大,算法的运行时间会呈平方级增长。
- 空间复杂度:选择排序是一个原地排序算法,它只使用常数级别的额外空间,因此空间复杂度是 O(1)。
2. 选择排序算法的实现步骤
2.1 选择排序的算法步骤
- 从数组中找到最小的元素。
- 将最小元素与数组中的第一个元素交换位置。
- 接着在剩余的元素中寻找最小的元素,将其与第二个元素交换位置。
- 重复以上步骤,直到整个数组有序。
2.2 选择排序的工作原理
假设我们有一个无序数组 [64, 25, 12, 22, 11]
,我们来通过选择排序对其进行排序:
- 第一次选择最小的元素是 11,将它与第一个元素 64 交换,得到数组
[11, 25, 12, 22, 64]
。 - 第二次选择最小的元素是 12,将它与第二个元素 25 交换,得到数组
[11, 12, 25, 22, 64]
。 - 第三次选择最小的元素是 22,将它与第三个元素 25 交换,得到数组
[11, 12, 22, 25, 64]
。 - 第四次选择最小的元素是 25,已经在正确的位置上,因此无需交换。
最后,数组排序完成:[11, 12, 22, 25, 64]
。
3. 选择排序的 Java 代码实现
3.1 选择排序算法的 Java 代码
public class SelectionSort {
// 选择排序算法
public static void selectionSort(int[] arr) {
// 遍历整个数组
for (int i = 0; i < arr.length - 1; i++) {
// 假设当前索引 i 处的元素是最小的
int minIndex = i;
// 在 i 之后的元素中找最小的
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j; // 更新最小元素的索引
}
}
// 如果 minIndex 不是 i,交换位置
if (minIndex != i) {
int temp = arr[i]; // 临时变量存储 arr[i]
arr[i] = arr[minIndex]; // 将最小元素放到前面
arr[minIndex] = temp; // 将 arr[i] 放到最小元素的位置
}
}
}
// 主函数,测试选择排序
public static void main(String[] args) {
int[] arr = {64, 25, 12, 22, 11}; // 初始化一个数组
System.out.println("排序前的数组:");
printArray(arr); // 打印排序前的数组
selectionSort(arr); // 调用选择排序
System.out.println("排序后的数组:");
printArray(arr); // 打印排序后的数组
}
// 打印数组的帮助函数
public static void printArray(int[] arr) {
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println(); // 换行
}
}
3.2 代码解释
- 初始化数组:我们定义了一个整数数组
arr = {64, 25, 12, 22, 11}
,并打印排序前的数组。 - 选择排序核心过程:
- 外层循环控制每一轮排序的起始位置。
- 内层循环用于在剩余的部分中查找最小值的索引。
- 如果内层循环找到的最小元素不是当前位置的元素,则交换它们的位置。
- 打印数组:通过
printArray
函数打印排序前和排序后的数组。
3.3 代码运行示例
假设我们运行上述代码,输出将是:
排序前的数组:
64 25 12 22 11
排序后的数组:
11 12 22 25 64
4. 选择排序的时间复杂度分析
4.1 时间复杂度分析
选择排序的时间复杂度是 O(n²)。这是因为:
- 外层循环从第一个元素开始,一直到倒数第二个元素,共需要进行
n-1
次。 - 内层循环在每次外层循环中,遍历剩余的元素,最坏情况下需要遍历
n-1, n-2, ..., 2, 1
次。
因此,选择排序的时间复杂度是 O(n²),这使得它在处理大规模数据时效率较低。
4.2 空间复杂度分析
选择排序是一种原地排序算法,它只需要常数级别的额外空间。无论输入数据的大小如何,选择排序的空间复杂度始终是 O(1)。
5. 选择排序的优缺点
5.1 优点
- 简单易懂:选择排序的算法非常简单,容易理解。
- 不需要额外的内存空间:选择排序是原地排序算法,空间复杂度仅为 O(1)。
- 适用于小规模数据:对于小规模的数据,选择排序可以很好地完成任务。
5.2 缺点
- 时间复杂度较高:选择排序的时间复杂度为 O(n²),对于大规模数据来说,效率较低。
- 不稳定排序:选择排序是一种不稳定的排序算法,相同元素的相对位置可能发生改变。
6. 总结
选择排序是一种简单的排序算法,适用于小规模的数据集合。它通过每次选择最小的元素,并将其交换到当前排序区间的末尾,逐步将整个数组排序。尽管它的时间复杂度较高(O(n²)),但它的实现简单且不需要额外的内存空间。选择排序是学习排序算法的一个重要步骤,但在处理大规模数据时,通常需要选择更高效的排序算法,如快速排序或归并排序。