题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=283
题目大意:
将N个字符串分成N/2个字符串(从上到下2个为一组),然后按顺序将每一组的第一个字符串放在顶端,第二个放在底部,依次放进,最后一个字符串排在中间。
(前提是要先按照字符串大小从小到大排序,然后相同长度的两个字符串位置不进行改变)
解题思路:
1.先对字符串进行排序(必须采用冒泡排序、归并排序等稳定排序,不稳定排序会导致相同长度的字符串前后位置不一,例如:选择排序、快排[该题可以过,可能测试数据比较水,各位可以测试一下])
2.对字符串进行隔层输出,如果是个数为奇数(例如9个:则按1、3、5、7、9、8、6、4、2输出),如果是偶数(例如10个:则按1、3、5、7、9、10、8、6、4、2输出)【最大的放中间、最小的放两边】
知识补充:选择排序、快速排序、希尔排序、堆排序是不稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。详细请见:http://xgw1008.blog.163.com/blog/static/56757356200892472828427/ 参考可见:http://blog.youkuaiyun.com/hkx1n/article/details/3922249
代码如下(C++ / 冒泡排序法):
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<math.h>
using
namespace
std;
int
main(){
int
i,j,k;
int
n;
k=1;
while
(
scanf
(
"%d"
,&n)&&n){
char
a[30][30];
for
(i=0;i<n;i++){
scanf
(
"%s"
,a[i]);
}
for
(i=0;i<n;i++){//冒泡排序法
for
(j=0;j<n-i-1;j++){
if
(
strlen
(a[j])>
strlen
(a[j+1])){
char
b[30];
strcpy
(b,a[j]);
strcpy
(a[j],a[j+1]);
strcpy
(a[j+1],b);
}
}
}
printf
(
"SET %d\n"
,k);
k++;
for
(i=0;i<n;i+=2){//由上到下分层输出
printf
(
"%s\n"
,a[i]);
}
if
(n%2!=0)
n--;
for
(i=n-1;i>=0;i-=2){
printf
(
"%s\n"
,a[i]);
}
}
return
0;
}