C++程序 选择排序
选择排序算法 通过重复从未排序的部分中找到最小元素(按升序考虑)并将其放置在开头来对数组进行排序。该算法在给定数组中维护两个子数组。
- 已排序的子数组。
- 未排序的剩余子数组。
在选择排序的每次迭代中,从未排序的子数组中选取最小元素(按升序考虑)并将其移动到已排序的子数组中。
选择排序的流程图:
选择排序如何工作?
接下来以以下数组为例: arr[]={64,25,12,22,11}
第一次遍历:
- 对于已排序数组的第一个位置,从索引0到4依次遍历整个数组。遍历整个数组后,存储 64 的第一个位置,可以明确地得出 11 是最小的值。
64 | 25 | 12 | 22 | 11 |
---|---|---|---|---|
- 因此,用11替换64。经过一次迭代,最小的值 11 刚好出现在排序列表的第一个位置。
11 | 25 | 12 | 22 | 64 |
---|---|---|---|---|
第二次遍历:
- 对于25出现的第二个位置,再次按顺序遍历整个数组。
11 | 25 | 12 | 22 | 64 |
---|---|---|---|---|
- 遍历后,我们发现 12 是数组中第二小的值,它应该出现在数组的第二个位置,因此交换这些值。
11 | 12 | 25 | 22 | 64 |
---|---|---|---|---|
第三次遍历:
- 现在,对于出现 25 的第三个位置,再次依次遍历剩余的数组,并找到数组中第三个最小的值。
11 | 12 | 25 | 22 | 64 |
---|---|---|---|---|
- 在遍历时, 22 被确定为第三小的值,它应该出现在数组的第三个位置,因此将 22 与第三个位置上的元素交换。
11 | 12 | 22 | 25 | 64 |
---|---|---|---|---|
第四次遍历:
- 类似地,对于第4个位置,在剩余数组中找到第四小的元素。
- 由于 25 是第4小的值,因此它将放置在第4个位置。
11 | 12 | 22 | 25 | 64 |
---|---|---|---|---|
第五次遍历:
- 最终,数组中最大的值会自动放置在数组的最后一个位置
- 结果数组是排序后的数组。
11 | 12 | 22 | 25 | 64 |
---|---|---|---|---|
方法:
- 将最小值(min_idx)初始化为位置0
- 遍历数组以找到数组中的最小元素
- 遍历时,如果找到任何小于 min_idx 的元素,则交换这两个值
- 然后将min_idx增加到下一个元素处
- 重复直到数组排序完成
下面是上述方法的实现:
输出:
选择排序的时间复杂度分析:
时间复杂度: 选择排序的时间复杂度为O(N2),因为有两个嵌套循环:
- 一个循环逐个选取数组中的元素= O(N)
- 另一个循环将该元素与每个其他数组元素进行比较= O(N)
因此,总体复杂度=O(N)*O(N)=O(N*N)=O(N2)
辅助空间: O(1) ,因为只有在交换数组中两个值时才使用临时变量的额外内存。选择排序的好处是它永远不会进行超过O(n)个交换,并且在内存写入成本很高时非常有用。
使用选择排序对字符串数组进行排序
选择排序算法是否稳定?
不稳定。但是可以使其稳定。请参见稳定选择排序以获取详细信息。
选择排序算法是原地排序算法吗?
是的,它不需要额外的空间。