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增加到下一个元素处
- 重复直到数组排序完成
下面是上述方法的实现:
// C++ program for implementation of ;
// selection sort
#include <bits/stdc++.h>
using namespace std;
//Swap function
void swap(int *xp, int *yp) ;
{
int temp = *xp;
*xp = *yp;
*yp = temp;
} ;
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 ;
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 to test above functions ;
int main() ;
{
int arr[] = {64, 25, 12, 22, 11};
int n = sizeof(arr)/sizeof(arr[0]);
selectionSort(arr, n);
cout << "Sorted array: ";
printArray(arr, n);
return 0;
} ;```
输出:
排过序的数组:
11 12 22 25 64
选择排序的时间复杂度分析:
时间复杂度: 选择排序的时间复杂度为O(N2),因为有两个嵌套循环:
- 一个循环逐个选取数组中的元素= O(N)
- 另一个循环将该元素与每个其他数组元素进行比较= O(N)
因此,总体复杂度=O(N)*O(N)=O(N*N)=O(N2)
辅助空间: O(1) ,因为只有在交换数组中两个值时才使用临时变量的额外内存。选择排序的好处是它永远不会进行超过O(n)个交换,并且在内存写入成本很高时非常有用。
使用选择排序对字符串数组进行排序
选择排序算法是否稳定?
不稳定。但是可以使其稳定。请参见稳定选择排序以获取详细信息。
选择排序算法是原地排序算法吗?
是的,它不需要额外的空间。