返回
剖析选择排序:算法详解与实战优化
见解分享
2023-12-19 20:05:18
选择排序算法以其极简的运作原理而闻名,它和冒泡排序一样,是初学编程者最先接触的排序算法。其运作方式可谓一目了然:假设要对一个包含 n 个元素的数组进行排序,该算法会从待排序部分中选择一个最小的元素,并把它放到数组的最左侧。如此这般,经过 n 轮筛选,数组就完成了排序。
虽然选择排序算法的原理简单,但它在优化上的潜力却颇为可挖。借鉴双向冒泡排序的优化思想,我们可以在一轮迭代中同时选出最大值和最小的元素,进而显著地优化筛选效率。
选择排序算法:逐步剖析
**1. 算法原理**
选择排序算法的运作原理非常简单。它从待排序数组中选取最小的元素,并把它放到数组的最左侧。随后,算法对剩余的元素重复执行这一过程,直到所有元素都完成排序。
**2. 算法步骤**
以下是选择排序算法的详细步骤:
1. 找出待排序数组中剩余元素的最小的元素。
2. 将最小的元素交换到数组的最左侧。
3. 将待排序部分缩小一个元素。
4. 返回到步骤 1,重复执行,直至数组完全有序。
**3. 算法优化**
选择排序算法的优化主要集中在减少元素比较和交换的频次上。
**优化策略 1:双向选择**
双向选择优化利用了这样一个事实:在每轮迭代中,最小的元素和最大的元素都位于数组的两端。因此,算法可以同时选出最大值和最小的元素,并把这两个元素交换到数组的两端。
**优化策略 2:单向选择**
单向选择优化基于这样一个事实:在每轮迭代中,最小的元素总是位于未排序部分的左侧。因此,算法只需从左向右迭代,选出最小的元素即可。
**实战代码示例**
```python
def selection_sort(arr):
"""
选择排序算法
Args:
arr: 待排序数组
Returns:
排序好的数组
"""
for i in range(len(arr)):
min_idx = i
max_idx = i
for j in range(i+1, len(arr)):
if arr[j] < arr[min_idx]:
min_idx = j
elif arr[j] > arr[max_idx]:
max_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
arr[i], arr[max_idx] = arr[max_idx], arr[i]
return arr
用例:
arr = [5, 3, 1, 2, 4]
print(selection_sort(arr))
结果:
[1, 2, 3, 4, 5]
小贴士:
- 选择排序算法的时间复杂度为 O(n^2),它不适用于大数据集的排序。
- 对于几乎已经排好序的数组,选择排序算法的效率会很高。