由于期末期间,完全把心思放在了预习课本和刷试卷了。基本上两个月没有写过代码。
过了考试,在刷CCF认证题库时,出现了很多的问题,甚至连冒泡排序都记不清楚。虽然最近物联网项目也比较紧,决定以后还是保持每天至少一个题的量度。晚上学习数据结构与算法。
下面是CCF认证的2015/3/2的一个数字排序题目,和类似的题(2013/12/1次数最多)。
2015/3/2
问题描述
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
5 2 3 3 1 3 4 2 5 2 3 5
2 3
5 3
1 1
4 1
#include<stdio.h>
typedef struct{
int x;
int y;
}str[1000];
int main(void)
{
str st;
int N;
int a,b,c,d=0,e,f;
int i=0,j,l;
int flag;
scanf("%d",&N);
while(N)
{
N--;
flag=1;
scanf("%d",&a);
for(j=0;j<i;j++)
{
if(st[j].x == a)
{
st[j].y++;
flag=0;
}
}
if(flag)
{
st[i].x=a;
st[i].y=1;
i++;
}
}
for(l=0;l<i-1;l++)//对次数进行冒泡排序
{
for(j=0;j<i-1-l;j++)
{
if(st[j+1].y >st[j].y)
{
b=st[j+1].y;
st[j+1].y=st[j].y;
st[j].y=b;
b=st[j+1].x;
st[j+1].x=st[j].x;
st[j].x=b;
}
}
}
for(l=0;l<i;l++)//将次数相同的进行冒泡排序
{
c=st[d].y;//找到次数
for(f=d;f<i;f++)
{
if(st[f].y != c)//从d到f-1是这次数相同的范围
{
break;
}
}
for(j=d;j<f-1+d;j++)//在范围内进行冒泡排序
for(e=d;e<f-1-j+d;e++)
{
if(st[e+1].x<st[e].x)
{
b=st[e].x;
st[e].x=st[e+1].x;
st[e+1].x=b;
}
}
d=f;
}
for(j=0;j<i;j++)
{
printf("%d %d\n",st[j].x,st[j].y);
}
return 0;
}
有好多的变量是可以不要的。当时也没想太多,就直接定义了。