一些OJ的排序题(冒泡排序的一般形式)

来源:互联网 发布:java字符流写入文件 编辑:程序博客网 时间:2024/05/29 16:44

由于期末期间,完全把心思放在了预习课本和刷试卷了。基本上两个月没有写过代码。

过了考试,在刷CCF认证题库时,出现了很多的问题,甚至连冒泡排序都记不清楚。虽然最近物联网项目也比较紧,决定以后还是保持每天至少一个题的量度。晚上学习数据结构与算法。

下面是CCF认证的2015/3/2的一个数字排序题目,和类似的题(2013/12/1次数最多)。

2015/3/2

问题描述

  给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入格式
  输入的第一行包含一个整数n,表示给定数字的个数。
  第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
  输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
样例输入
12
5 2 3 3 1 3 4 2 5 2 3 5
样例输出
3 4
2 3
5 3
1 1
4 1
评测用例规模与约定
  1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数
本题的思路:由输入来确定这个数的出现次数,用结构体的成员分别表示这个数和这个数的次数,再用冒泡排序对次数排序,然后针对次数相同的,再进行冒泡排序。也可以采用快速排序。2013年的那个题可以,直接打印第一项的数字即可。
源代码如下:
#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; 
 } 
  有好多的变量是可以不要的。当时也没想太多,就直接定义了。

0 0
原创粉丝点击