选择排序
一、思想
1、基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前,直到全部待排序的数据元素排完。
2、排序过程:
初 始 [49 38 65 97 76 13 27 49]
第一趟排序后 13 [38 65 97 76 49 27 49]
第二趟排序后 13 27 [65 97 76 49 38 49]
第三趟排序后 13 27 38 [97 76 49 65 49]
第四趟排序后 13 27 38 49 [76 97 65 49]
第五趟排序后 13 27 38 49 49 [97 65 76]
第六趟排序后 13 27 38 49 49 65 [97 76]
第七趟排序后 13 27 38 49 49 65 76 [97]
最后排序结果 13 27 38 49 49 65 76 97
归纳上述排序过程,具体实现步骤如下:
1、读入数据存放在a数组中。
2、在a[1]~a[n]中选择值最小的元素,与第1位置元素交换,则把最小值元素放入a[1]中。
3、在a[2]~a[n]中选择值最小的元素,与第2位置元素交换,则把最小值元素放入a[2]中。
……
直到第n-1个元素与第n个元素比较排序为止。
3、程序实现方法:用两层循环完成算法,外层循环i控制当前序列最小值存放的数组位置,内层循环j控制从i+1到n序列中选择最小的元素所在位置k。
二、代码
#include <cstdio>
int a[1005];
int main() {
int n, k;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= n; i++) {
k = i;
for (int j = i + 1; j <= n; j++) {
if (a[j] < a[k]) {
k = j;
}
}
if(k != i) {
int t = a[i];
a[i] = a[k];
a[k] = t;
}
}
for(int i = 1; i <= n; i++) {
printf("%d ", a[i]);
}
return 0;
}