知识点
选择排序法执行步骤
(1)数组A一开始处于未排序状态
(2)从未排序部分找出出最小值的位置minj。
(3)将minj位置的元素与未排序部分的起始位置交换
(4)交换后,则前一步骤的起始位置就是排序后的元素,未排序部分的元素就从下一位开始
(5)执行步骤(2),直到全部元素都排序好。
小结
时间复杂度 O(n2) ,空间复杂度 O(n) , 是不稳定排序
问题链接
问题内容
计算数列A通过选择排序法交换元素的次数和排序完的结果
思路
在选择排序法交换元素后累加即可
代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
// 选择排序法
int selectionSort(int A[], int n) {
int cnt = 0;
for (int i = 0; i < n; i++) {
int minj = i;
for (int j = i; j < n; j++) {
if (A[j] < A[minj])
minj = j;
}
if (i != minj)
swap(A[i], A[minj]), cnt++;
}
return cnt;
}
int main() {
int n, A[110];
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &A[i]);
int cnt = selectionSort(A, n);
for (int i = 0; i < n; i++)
printf("%d%c", A[i], i == n - 1 ? '\n' : ' ');
printf("%d\n", cnt);
return 0;
}