一、原理
(1) 从整个数组中找到最小值,并将其移动至第0位
(2) 从第1位到最后数组找到最小值,并将其移动至第1位
…
(n) 从第(n-1)位到最后数组找到最小值,并将其移动至第(n-1)位
实现可以使用双嵌套循环,第一层指定数组起点,第二层取出最小值。
二、实现
#include <cstdio>
int main() {
// 输入
int n;
scanf("%d", &n);
int i;
int j;
int data[n + 5];
for(i = 0; i < n; i++) {
scanf("%d", &data[i]);
}
// 排序
int temp;
for(i = 0; i < n; i++) {
int minindex = i; // 存放i~n之间最小元素的角标(index)
for(j = i; j < n; j++) if(data[j] < data[minindex]) minindex = j; // 如果想从大到小排列则将此处的小于号换成大于号
temp = data[i];
data[i] = data[minindex];
data[minindex] = temp;
}
// 输出
for(i = 0; i < n; i++) {
printf("%d ", data[i]);
}
return 0;
}
三、思考
本算法的实现会造成数组的遍历进行n*n次,有何更佳方法以减少时间消耗?
参考:详解选择排序和对其优化 - GodLike