今天做了下排序系列题目,明天再去磕二叉树。
直接插入排序
题目描述
利用直接插入排序算法实现线性表的排序。要求输出第k趟排序的结果。例如原来线性表为:26,12,25,4,36,15,21,第一趟直接排序排序结果为: 12,26,25,4,36,15,21,第二趟直接插入排序结果为: 12,25,26, 4,36,15,21。
输入
输入包含若干个测试用例,第一行为测试用例个数。每个测试用例占3行,第一个为元素个数n(1<=n<=1000),第二行为n个元素值(整数),即需要排序的元素个数,第三行为k(1<=k<=n-1),即要求的第k趟排序结果。
输出
对每一测试用例,用一行输出第k趟排序结果,用空格隔开。
样例输入 复制
1
5
2 4 1 9 7
3
样例输出 复制
1 2 4 9 7
思路:一开始用的冒泡排序,oj上一直卡在67%,然后发现他是将第一个数和第二个数比较,如果,大于,则交换位置。并直接将第二个数(即下一个数与后面的比较)的过程算作一次。用这个思路便能解题。
小兔子的果园
题目描述
小兔子有n个果园,果园里有许多果树,有苹果树,芒果树,香蕉树,李子树,无花果树。
终于到了丰收的季节,小兔子从每个果园采了许多的水果,现在小兔子想给每个果园的产量排序。
因为小兔子爱吃芒果,所以按芒果的数量从大到小排序,如果芒果的数量相同,那就按照其他水果的总数量从小到大排序。
不会存在芒果数量相同且其他水果的总数量相同的情况。
输入
第一行输入一个n,代表n个果园(1<=n<=10)
接下来n行,每行五个数,分别代表小兔子从果园里采摘的苹果数量,芒果数量,香蕉数量,李子数量,无花果数量
每个水果的数量不超过10,且没有负数。
输出
输出n个果园产量排序后的结果
样例输入 复制
5
1 2 3 4 5
1 3 3 4 5
1 4 2 2 2
1 1 1 1 1
1 4 1 1 1
样例输出 复制
1 4 1 1 1
1 4 2 2 2
1 3 3 4 5
1 2 3 4 5
1 1 1 1 1
思路:能好的运用结构体就能做出来。将芒果单独拎出来比较,芒果数相等用其他水果总数比较,最后用冒泡排序就解决啦
#include<stdio.h>
struct tree
{
int a,b,c,d,e,f;
} s[10];
struct tree t[10];
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d %d %d %d %d",&s[i].a,&s[i].b,&s[i].c,&s[i].d,&s[i].e);
s[i].f=s[i].a+s[i].c+s[i].d+s[i].e;
}
for(int i=0; i<n-1; i++)
{
for(int j=0; j<n-i-1; j++)
{
if(s[j].b<s[j+1].b)
{
t[j]=s[j];
s[j]=s[j+1];
s[j+1]=t[j];
}
if(s[j].b==s[j+1].b)
{
if(s[j].f>s[j+1].f)
{
t[j]=s[j];
s[j]=s[j+1];
s[j+1]=t[j];
}
}
}
}
for(int i=0; i<n; i++)
{
printf("%d %d %d %d %d\n",s[i].a,s[i].b,s[i].c,s[i].d,s[i].e);
}
}
竞选主席
题目描述
又来到了四年一度的主席竞选大赛,然后有n个候选人,编号分别是从1-n,现在需要你统计出票数最多的候选人是谁
输入
输入n
然后依次是n行
下面第几行就代表第几个候选人的票数
输出
输出最多票数的候选人编号以及票数
样例输入
5
98765
12365
87954
1022356
985678
样例输出
4
1022356
提示
票数可能会达到100位数字
n<=20
思路:题目说到票数可能会达到100位数字,很明显要用字符串来做,用大数存储票数,难免会出现问题。设定好字符串后,先比较字符串长度,长度相等则用strcmy函数逐位比较即可。也是容易解出。