1406: 数列排序
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
将一正整数序列{K1,K2,...,K9}重新排列成一个新的序列。新序列中,比K1小的数都在K1的前面(左面),比K1大的数都在K1的后面(右面)。
输入
输入有多行,第一行为N表示行数,每行9个整数.
输出
输出N行,按要求进行排序的结果.
样例输入 Copy
2 6 8 9 1 2 5 4 7 3 3 5 8 9 1 2 6 4 7
样例输出 Copy
3 4 5 2 1 6 8 9 7 2 1 3 5 8 9 6 4 7
此贴为c语言初学者的复盘帖,方法并非最优解,仅作为可能的一种借鉴方法。
法1:“插入排序“‘
注意:这里并非算法中的插入排序!!!这里只是答主的一种说法!!!
思考:从左向右便利数组,遇到比K1小的数(这里称为Ki)便让0-(i-1)位上储存的数整体向右移动,并将Ki作为第0位储存,以此循环。
代码:#include <stdio.h>
#include <ctype.h>
int main()
{
int N;
scanf("%d",&N);
getchar();
for(int m=0;m<N;m++){
int ch=getchar();
char number[9]={0};
int n=0;
while(n<9){
if(isdigit(ch)){ //isdigit判断是否为数字
number[n++]=ch-48;
}
ch=getchar();
}
int flag=number[0];//比对的标准值
int i;
for(i=1;i<9;i++){
if(number[i]<flag){
int te=number[i];//储存这个小值
int temp=number[0];//储存第0位的值方便后续运算
int ten;
int j;
for(j=1;j<=i;j++){
ten=number[j];//暂时储存第j位值
number[j]=temp;//将第j-1位的值赋第j位
temp=ten;//储存第j位的值,
}
number[0]=te;//不能直接=number[i],因为此时第i位储存的值实际为之前第i-1位储存的值
}
}
int k=0;
for(k=0;k<8;k++){
printf("%d ",number[k]);
}
printf("%d\n",number[k]);
}
return 0;
}
法2:选择在遍历过程中使用两个数组分别储存大于K1的值与小于K1的值
思维上比法1简单,所以这里不做赘述。