正在载入交互式动画窗口请稍等
简单选择排序 可视化交互式动画版
选择排序 是一种简单而高效的排序算法,其工作原理是重复从列表的未排序部分中选择最小(或最大)元素并将其移动到列表的已排序部分。
该算法重复从列表的未排序部分中选择最小(或最大)元素,并将其与未排序部分的第一个元素交换。 对剩余的未排序部分重复此过程,直到整个列表排序完毕。
选择排序算法如何工作?
让我们以以下数组为例: arr[] = {64, 25, 12, 22, 11}
第一遍:
- 对于排序数组中的第一个位置,从索引 0 到 4 顺序遍历整个数组。 当前存储64 的第一个位置 ,遍历整个数组后很明显 11 是最低值。
- 因此,将 64 替换为 11。一次迭代后, 11 (恰好是数组中的最小值)往往会出现在排序列表的第一个位置。
第二遍:
- 对于存在 25 的第二个位置,再次按顺序遍历数组的其余部分。
- 遍历完后,我们发现 12 是数组中倒数第二小的值,它应该出现在数组的第二位,因此交换这些值。
第三遍:
- 现在,对于第三个位置,其中存在 25, 再次遍历数组的其余部分并找到数组中存在的第三个最小值。
- 遍历时, 22 是第三个最小值,它应该出现在数组中的第三个位置,因此将 22 与第三个位置上的元素交换。
第四遍:
- 类似地,对于第四个位置,遍历数组的其余部分并找到数组中第四小的元素
- 由于 25 是第四低的值,因此它将排在第四位。
第五关:
- 最后,数组中存在的最大值自动放置在数组的最后一个位置
- 结果数组是排序后的数组。
下面是上述方法的实现:
- C++
- C
- Python3
- Java
- C#
- PHP
- JavaScript
C++
// C++ program for implementation of // selection sort #include <bits/stdc++.h> using namespace std; // Function for Selection sort void selectionSort( int arr[], int n) { int
i, j, min_idx; // One by one move boundary of // unsorted subarray for (i = 0; i < n - 1; i++) {
// Find the minimum element in // unsorted array min_idx = i; for (j = i + 1; j < n; j++) {
if (arr[j] < arr[min_idx]) min_idx = j; } // Swap the found minimum element // with the first element if (min_idx != i) swap(arr[min_idx], arr[i]); } } // Function to print an array void printArray( int arr[], int size) { int
i; for (i = 0; i < size; i++) { cout << arr[i] << " " ; cout << endl; } } // Driver program int main() { int
arr[] = { 64, 25, 12, 22, 11 }; int
n = sizeof (arr) / sizeof (arr[0]); // Function Call selectionSort(arr, n); cout << "Sorted array: \n" ; printArray(arr, n); return 0; } // This is code is contributed by rathbhupendra |
C
Python3
Java
C#
PHP
JavaScript
排序数组: 11 12 22 25 64
选择排序的复杂度分析
时间复杂度: 选择排序的时间复杂度为 O(N 2 ) ,因为有两个嵌套循环:
- 一个循环逐一选择 Array 的元素 = O(N)
- 另一个循环将该元素与每个其他数组元素进行比较 = O(N)
- 因此总体复杂度 = O(N) * O(N) = O(N*N) = O(N 2 )
辅助空间: O(1),因为在交换数组中的两个值时,唯一使用的额外内存用于临时变量。 选择排序不会进行超过 O(N) 的交换,并且在内存写入成本高昂时非常有用。
选择排序算法的优点
- 简单易懂。
- 适用于小型数据集。
选择排序算法的缺点
- 在最坏和平均情况下,选择排序的时间复杂度为 O(n^2)。
- 在大型数据集上效果不佳。
- 不保留具有相同键的项目的相对顺序,这意味着它不稳定。
选择排序的常见问题
Q1. 选择排序算法稳定吗?
选择排序算法的默认实现并不 稳定 。 然而,它可以变得稳定。 详细信息 请参阅 稳定的选择排序。
Q2。 选择排序算法是否到位?
是的,选择排序算法是一种就地算法,因为它不需要额外的空间。