4-2 比较排序:选择排序
选择排序
选择排序是一种基于比较的排序算法。它通过反复从未排序部分中选择最小(或最大)元素,并将其与第一个未排序元素交换来进行排序。
- 找出最小的元素,并将其与第一个元素交换位置。这样,我们就得到了位置正确的最小元素。
- 然后找出剩余元素中的最小元素(或第二小元素),并将其与第二个元素交换。
- 我们重复这个步骤,直到所有元素都移动到正确的位置。
代码实现
// 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;
}
输出:

选择排序的复杂性、优缺点以及应用:
时间复杂度:O(n² ),因为有两个嵌套循环:
- 用一个循环逐个选择数组元素 = O(n)
- 再循环一次,将该元素与数组中的其他每个元素进行比较 = O(n)
- 因此,总复杂度 = O(n) * O(n) = O(n*n) = O( n² )
辅助空间: O(1),因为唯一使用的额外内存是临时变量。
选择排序的优点
- 易于理解和实施,是教授基本排序概念的理想选择。
- 仅需 O(1) 的额外内存空间。
- 与其他许多标准算法相比,它所需的交换次数(或内存写入次数)更少。只有循环排序在内存写入方面优于它。因此,当内存写入成本较高时,它可能是一个不错的算法选择。
选择排序的缺点
- 选择排序的时间复杂度为 O(n^2),因此与快速排序或归并排序等算法相比速度较慢。
- 它不能保持相等元素之间的相对顺序,这意味着它是不稳定的。
选择排序的应用
- 非常适合用于教授基本的排序机制和算法设计。
- 适用于小型列表,因为与其他标准排序算法相比,它需要的内存写入更少,而更复杂的算法的开销并不值得,内存写入成本也更高。
- 堆排序算法是基于选择排序的。

浙公网安备 33010602011771号