提示:参考算法4和百度
简单理解
提示:找最小的数放在第一个,找第二小的数放在第二个,至放完为止。
第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
一、时间复杂度
提示:n^2/2比较,n交换
选择排序的交换次数为n,算法的时间效率取决于比较次数。
比较的次数为(n-1)+(n-2)+……+1=n*(n-1)/2,取n^2/2次比较。
二、特点
运行时间与输入无关,一个已经有序的数组或者组建全部相等的数组和一个元素随机排列的数组所用的排序时间一样长。
数据移动是最少的,交换只需要n次。
三、C++代码实现
#include<cstdio>
#define MAX 100
int a[MAX];
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (int i = 0; i < n; i++) {
int min_index = i;
int min = a[i];
for (int j = i; j < n-1; j++) {
if (min > a[j + 1]) {
min_index = j + 1;
min = a[j + 1];
}
}
if (i != min_index) {
int* p1 = &a[i], *p2 = &a[min_index];
swap(p1, p2);
}
}
for (int i = 0; i < n; i++) {
printf("%d", a[i]);
if (i < n - 1) {
printf(" ");
}
}
return 0;
}
四、VS中scanf出错
项目–>属性–>C/C+±->预处理器–>预处理器定义–>点击右侧下拉列表–>编辑–>输入_CRT_SECURE_NO_WARNINGS