嗨,大家好,我是小欧!
今天我要带大家探讨一个既简单又有趣的排序算法——选择排序。别担心,这不是上数学课,也不是高深的计算机科学,咱们用最接地气的语言把这个算法弄明白。
什么是选择排序?
选择排序,顾名思义,就是在一堆数据里挑挑拣拣,把最小(或者最大)的挑出来,放到该放的位置,直到所有数据都井井有序。想象一下你在市场买菜,选最好的苹果,先把最小的放到篮子里,再挑剩下的,直到你买完为止。
工作原理
- 在未排序的部分中找到最小(或最大)的元素。
- 将这个元素与未排序部分的第一个元素交换位置。
- 重复上述过程,直到所有元素都被排序。
简单来说,就是“找最小,换位置,再找下一个最小,继续换,直到排序完成”。
案例分析
为了让大家更容易理解,咱们用两个具体的例子来讲解选择排序的过程。
案例一:升序排序
假设我们有一组数据:[64, 25, 12, 22, 11]
,咱们一步一步把它排成升序的。
- 初始数组:
[64, 25, 12, 22, 11]
- 找到最小元素11,并与第一个元素64交换:
[11, 25, 12, 22, 64]
- 剩余未排序部分:
[25, 12, 22, 64]
,找到最小元素12,与第一个元素25交换:[11, 12, 25, 22, 64]
- 继续找:
[25, 22, 64]
,找到最小元素22,与第一个元素25交换:[11, 12, 22, 25, 64]
- 最后一轮:
[25, 64]
,它们已经有序,不用再动。
最终的结果是:[11, 12, 22, 25, 64]
案例二:降序排序
当然,我们也可以用选择排序来排降序。还是用同样的数据:[64, 25, 12, 22, 11]
。
- 初始数组:
[64, 25, 12, 22, 11]
- 找到最大元素64,它已经在第一个位置,不用换。
- 剩余未排序部分:
[25, 12, 22, 11]
,找到最大元素25,与第一个元素交换:[64, 25, 12, 22, 11]
- 继续找:
[12, 22, 11]
,找到最大元素22,与第一个元素12交换:[64, 25, 22, 12, 11]
- 最后一轮:
[12, 11]
,找到最大元素12,它已经在第一个位置,不用动。
最终结果是:[64, 25, 22, 12, 11]
代码实现
接下来,咱们来看看用Java代码是怎么实现选择排序的,分别展示升序和降序排序。
升序排序
public class SelectionSort {
public static void selectionSortAsc(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
public static void main(String[] args) {
int[] arr = {64, 25, 12, 22, 11};
selectionSortAsc(arr);
for (int num : arr) {
System.out.print(num + " ");
}
}
}
运行结果:
11 12 22 25 64
降序排序
public class SelectionSort {
public static void selectionSortDesc(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int maxIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] > arr[maxIndex]) {
maxIndex = j;
}
}
int temp = arr[maxIndex];
arr[maxIndex] = arr[i];
arr[i] = temp;
}
}
public static void main(String[] args) {
int[] arr = {64, 25, 12, 22, 11};
selectionSortDesc(arr);
for (int num : arr) {
System.out.print(num + " ");
}
}
}
运行结果:
64 25 22 12 11
选择排序的时间复杂度
选择排序的时间复杂度为O(n^2),也就是当数据量增大时,排序所需的时间会呈指数级增加。这是因为它需要进行两层嵌套循环,每个循环最多执行n次。不过好消息是,它的空间复杂度为O(1),因为它是一个原地排序算法,不需要额外的存储空间。
适用场景
虽然选择排序在性能上不如快速排序和归并排序,但它有自己的优势:
- 数据量较小时,选择排序的实现非常简单直接。
- 适合需要稳定排序结果的场合,比如学习和教学。
- 作为初学者了解排序算法的入门选择,它非常直观。
总结
今天,我们通过简单易懂的语言和具体的例子,详细讲解了选择排序的原理。通过两个小案例展示了升序和降序排序的过程,并提供了相应的Java代码实现。希望通过这篇文章,大家能够对选择排序有一个清晰的理解,并能在实际编程中应用。
如果你有任何疑问或需要进一步的讲解,欢迎在评论区留言。谢谢大家的阅读,关注+订阅期待下一次的技术分享!