序言
你只管努力,其他交给时间,时间会证明一切。
文章标记颜色说明:
- 黄色:重要标题
- 红色:用来标记结论
- 绿色:用来标记一级论点
- 蓝色:用来标记二级论点
决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。
我们一起努力,成为更好的自己!
今天第3讲,讲一下排序算法的选择排序(Selection Sort)
1 基础介绍
排序算法是很常见的一类问题,主要是将一组数据按照某种规则进行排序。
以下是一些常见的排序算法:
冒泡排序(Bubble Sort)
插入排序(Insertion Sort)
选择排序(Selection Sort)
归并排序(Merge Sort)
快速排序(Quick Sort)
堆排序(Heap Sort)
一、选择排序介绍
原理介绍
选择排序(Selection Sort)是一种简单的排序算法,其基本原理是在未排序的元素中找到最小(或最大)的元素,然后将其放在已排序的序列的末尾。重复这个过程,直到所有元素都被排序完毕。
具体来说,选择排序的实现过程如下:
- 遍历整个待排序的数组,从第一个元素开始。
- 在未排序的部分中,找到最小(或最大)的元素,并将其与第一个元素交换位置。
- 接着从第二个元素开始,重复步骤2,直到所有元素都被排序
下面是一个示例,展示了选择排序如何对一个数组进行排序:
原始数组:[5, 1, 9, 3, 7]
第一轮排序:
未排序部分:[5, 1, 9, 3, 7]
当前最小值:1
交换位置后:[1, 5, 9, 3, 7]第二轮排序:
未排序部分:[5, 9, 3, 7]
当前最小值:3
交换位置后:[1, 3, 9, 5, 7]第三轮排序:
未排序部分:[9, 5, 7]
当前最小值:5
交换位置后:[1, 3, 5, 9, 7]第四轮排序:
未排序部分:[9, 7]
当前最小值:7
交换位置后:[1, 3, 5, 7, 9]第五轮排序:
未排序部分:[9]
当前最小值:9
交换位置后:[1, 3, 5, 7, 9]经过五轮排序后,数组已经被排序完毕。
复杂度
虽然选择排序的思路简单,但是它的时间复杂度为O(n^2),其中n是数组中元素的数量。
因此,对于大规模的数据集,选择排序的性能会受到很大的影响,不如其他高效的排序算法。
空间复杂度为O(1),即不需要额外的空间来存储排序结果。
在排序过程中,只需要进行元素之间的比较和交换操作,不需要使用辅助的数据结构。
因此,选择排序是一种原地排序算法,它可以在原始数组上进行排序,不需要使用额外的空间。
这也是选择排序在一些特定场景下仍然有用的原因之一。
使用场景
选择排序,由于它简单性和实现的易用性,常常被用于教学和学习排序算法的入门课程中。但是在实际应用中,由于其时间复杂度较高,选择排序并不是最优秀的排序算法。
尽管如此,它仍然有一些适用场景,例如:
对于非常小的数据集,选择排序的性能可能并不比其他高效排序算法差多少。在这种情况下,选择排序的简单性和易用性可能更加重要。
在一些特定场景下,需要对数据进行部分排序或者仅需要找到最小(或最大)的k个元素。在这种情况下,可以使用选择排序的变体——选择部分排序(Select Partial Sort)算法,通过一些优化策略可以提高其性能。
由于选择排序的实现过程中只涉及到元素之间的比较和交换操作,不需要使用额外的空间,因此可以在内存受限的环境下使用。
总之,选择排序虽然并不是最优秀的排序算法,但是在一些特定场景下仍然有其适用性和价值。
二、代码实现
2.1 Python 实现
下面是使用Python实现选择排序的代码:
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i+1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
使用了Python内置的交换语法
a, b = b, a
来进行元素的交换,可以使代码更加简洁易读。
下面是使用Python实现选择部分排序的代码,其中k表示要找到的最小元素的个数:
def select_partial_sort(arr, k):
n = len(arr)
for i in range(k):
min_idx = i
for j in range(i+1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr[:k]
这里的实现和普通的选择排序略有不同,每轮排序只找到一个最小元素,然后将其放在已排序部分的末尾。最终返回前k个元素即为最小的k个元素。
2.2Java实现
下面是使用Java实现选择排序的代码:
public class SelectionSortExample {
public static void main(String[] args) {
int[] arr = { 5, 1, 9, 3, 7 };
selectionSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void selectionSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n; i++) {
int minIdx = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIdx]) {
minIdx = j;
}
}
int temp = arr[i];
arr[i] = arr[minIdx];
arr[minIdx] = temp;
}
}
}
这个代码和前面Python的实现类似,都是使用两重循环,外层循环遍历整个数组,内层循环找到未排序部分中的最小元素,并将其放在已排序部分的末尾。
这个示例中,
- 首先定义了一个整型数组
arr
- 然后调用
selectionSort
方法对其进行排序- 最后,使用
Arrays.toString
方法将排序结果打印出来在
selectionSort
方法中,实现了选择排序的核心逻辑,使用两重循环遍历数组,找到未排序部分中的最小元素,并将其交换到已排序部分的末尾。最终,排序结果存储在原始数组中,不需要使用额外的空间。
执行该示例的输出结果为:
[1, 3, 5, 7, 9]
,即排序后的整型数组。
图书推荐
图书列表:
- python分布式机器学习
- Python Web 深度学习
- Pandas1.X 实例讲解
- Python 从入门到精通
- mysql 数据库基础与实战应用
python分布式机器学习
Python Web 深度学习
Pandas1.X 实例讲解
Python 从入门到精通
mysql 数据库基础与实战应用
618,清华社 IT BOOK 多得图书活动开始啦!活动时间为 2023 年 6 月 7 日至 6 月 18 日,清华社为您精选多款高分好书,涵盖了 C++、Java、Python、前端、后端、数据库、算法与机器学习等多个 IT 开发领域,适合不同层次的读者。全场 5 折,扫码领券更有优惠哦!快来京东点击链接 IT BOOK 多得,查看详情吧!
活动链接:IT BOOK
参与方式
图书数量:本次送出 3 本 !!!⭐️⭐️⭐️
活动时间:截止到 2023-06-13 12:00:00抽奖方式:
- 评论区随机挑选小伙伴!
留言内容,以下方式都可以:
- 文章高质量评论+【你想要的书名】
- 投资自己是人一生中最重要的投资+【你想要的书名】
参与方式:关注博主、点赞、收藏,评论区留言
中奖名单
🍓🍓 获奖名单🍓🍓
中奖名单:请关注博主动态
名单公布时间:2023-06-13 下午