4-2 比较排序:选择排序

选择排序

选择排序是一种基于比较的排序算法。它通过反复从未排序部分中选择最小(或最大)元素,并将其与第一个未排序元素交换来进行排序。

  1. 找出最小的元素,并将其与第一个元素交换位置。这样,我们就得到了位置正确的最小元素。
  2. 然后找出剩余元素中的最小元素(或第二小元素),并将其与第二个元素交换。
  3. 我们重复这个步骤,直到所有元素都移动到正确的位置。

代码实现

// C++ program to implement Selection Sort
#include <bits/stdc++.h>

void selectionSort(std::vector<int> &arr)
{
    int n = arr.size();

    for (int i = 0; i < n - 1; ++i)
    {
        // Assume the current position holds
        // the minimum element
        int min_idx = i;

        // Iterate through the unsorted portion
        // to find the actual minimum
        for (int j = i + 1; j < n; ++j)
        {
            if (arr[j] < arr[min_idx])
            {
                // Update min_idx if a smaller
                // element is found
                min_idx = j;
            }
        }

        // Move minimum element to its
        // correct position
        std::swap(arr[i], arr[min_idx]);
    }
}

void printArray(std::vector<int> &arr)
{
    for (int &val : arr)
    {
        std::cout << val << " ";
    }
    std::cout << std::endl;
}

int main()
{
    std::vector<int> arr = {64, 25, 12, 22, 11};

    std::cout << "Original array: ";
    printArray(arr);

    selectionSort(arr);

    std::cout << "Sorted array: ";
    printArray(arr);

    return 0;
}

输出:
image


选择排序的复杂性、优缺点以及应用:

时间复杂度:O(n² ),因为有两个嵌套循环:

  • 用一个循环逐个选择数组元素 = O(n)
  • 再循环一次,将该元素与数组中的其他每个元素进行比较 = O(n)
  • 因此,总复杂度 = O(n) * O(n) = O(n*n) = O( n² )

辅助空间: O(1),因为唯一使用的额外内存是临时变量。

选择排序的优点

  • 易于理解和实施,是教授基本排序概念的理想选择。
  • 仅需 O(1) 的额外内存空间。
  • 与其他许多标准算法相比,它所需的交换次数(或内存写入次数)更少。只有循环排序在内存写入方面优于它。因此,当内存写入成本较高时,它可能是一个不错的算法选择。

选择排序的缺点

  • 选择排序的时间复杂度为 O(n^2),因此与快速排序或归并排序等算法相比速度较慢。
  • 它不能保持相等元素之间的相对顺序,这意味着它是不稳定的。

选择排序的应用

  • 非常适合用于教授基本的排序机制和算法设计。
  • 适用于小型列表,因为与其他标准排序算法相比,它需要的内存写入更少,而更复杂的算法的开销并不值得,内存写入成本也更高。
  • 堆排序算法是基于选择排序的。
posted @ 2026-03-30 17:10  游翔  阅读(0)  评论(0)    收藏  举报