返回

剖析选择排序:算法详解与实战优化

见解分享



选择排序算法以其极简的运作原理而闻名,它和冒泡排序一样,是初学编程者最先接触的排序算法。其运作方式可谓一目了然:假设要对一个包含 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]

小贴士:

  1. 选择排序算法的时间复杂度为 O(n^2),它不适用于大数据集的排序。
  2. 对于几乎已经排好序的数组,选择排序算法的效率会很高。