有n个整数,请使用选择排序算法对其按从小到大排序,输出第m趟排序的结果。 输入 测试数据有多组,每组的第一行是两个正整数n和m,其中2<=n<=20,0<m<=n-1,第二行是n个整数,所有数据之间均用空格分隔。 输出 对于每组测试数据,输出单独的一行,对这n个整数进行m趟选择排序后的结果。数据之间用一个空格分隔 #include<stdio.h> int main() { int a[21]; int i,j,max,min,k,m,n,t; while(scanf("%d %d",&n,&m)!=EOF) { for(i=0;i<n;i++) { scanf("%d",&a[i]); } for(j=0;j<m;j++) { max=-100000; min=1000000; for(i=0;i<n-j;i++) { if(a[i]>max) { max=a[i]; k=i; } } a[k]=a[n-1-j]; a[n-1-j]=max; for(i=0;i<n-j;i++) { if(a[i]<min) { min=a[i]; t=i; } } a[t]=a[j]; a[j]=min; } for(i=0;i<n;i++) { printf("%d ",a[i]); } } return 0; }
时间: 2024-01-22 21:04:11 浏览: 137
这是一个简单的选择排序算法的实现,每一轮排序都会找到当前未排序数组中最大和最小的数,然后将其分别放置在已排序数组的末尾和开头。在输出第m趟排序的结果时,只需要在排序的外层循环中添加一个计数器,当计数器等于m时,输出当前的排序结果即可。
以下是代码实现:
```c
#include <stdio.h>
int main() {
int a[21];
int i, j, max, min, k, t, m, n;
while (scanf("%d%d", &n, &m) != EOF) {
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (j = 0; j < m; j++) {
max = -100000; // 初始化最大值和最小值
min = 1000000;
for (i = 0; i < n - j; i++) {
if (a[i] > max) { // 找到当前未排序数组中最大的数
max = a[i];
k = i; // 记录最大值的下标
}
}
a[k] = a[n - 1 - j]; // 将最大值放置在已排序数组的末尾
a[n - 1 - j] = max;
for (i = 0; i < n - j; i++) {
if (a[i] < min) { // 找到当前未排序数组中最小的数
min = a[i];
t = i; // 记录最小值的下标
}
}
a[t] = a[j]; // 将最小值放置在已排序数组的开头
a[j] = min;
}
for (i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
return 0;
}
```
注意:这个选择排序算法的时间复杂度为O(n^2),在数据规模较大时可能会比较慢。
阅读全文