一种排序
-
描述
-
现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);
1.按照编号从小到大排序
2.对于编号相等的长方形,按照长方形的长排序;
3.如果编号和长都相同,按照长方形的宽排序;
4.如果编号、长、宽都相同,就只保留一个长方形用于排序,删除多余的长方形;最后排好序按照指定格式显示所有的长方形;-
输入
-
第一行有一个整数 0<n<10000,表示接下来有n组测试数据;
每一组第一行有一个整数 0<m<1000,表示有m个长方形;
接下来的m行,每一行有三个数 ,第一个数表示长方形的编号,
第二个和第三个数值大的表示长,数值小的表示宽,相等
说明这是一个正方形(数据约定长宽与编号都小于10000);
输出
- 顺序输出每组数据的所有符合条件的长方形的 编号 长 宽 样例输入
-
1 8 1 1 1 1 1 1 1 1 2 1 2 1 1 2 2 2 1 1 2 1 2 2 2 1
样例输出
-
1 1 1 1 2 1 1 2 2 2 1 1
2 2 1
-
-
写了两个代码
-
<1>
-
#include<stdio.h>
#include<algorithm>//这个代码的是sort排序;这是需要调用的头文件;
#define MAXN 1000
using namespace std;//需要的头文件
struct Node //长方形组员结构体
{
int num;
int len;
int wide;
};
int cmp(Node a,Node b)//sort排序函数
{
if(a.num!=b.num)
return a.num<b.num;// eg:如果return x<y意思是将升序排序,return x>y。意思是降序
else if(a.len!=b.len)
return a.len<b.len;//按照题意是按照升序的顺序排列
else if(a.wide!=b.wide)
return a.wide<b.wide;
}
int main()
{
int T,i,j,n,temp;
Node s[MAXN];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d%d",&s[i].num,&s[i].len,&s[i].wide);//输入长方形的各个组员的数据
if(s[i].len<s[i].wide)//根据题意输入较大的那个数为长,小的为宽
{
temp=s[i].len;
s[i].len=s[i].wide;
s[i].wide=temp;
}
}
printf("\n");
sort(s,s+n,cmp);//调用排序函数进行排序;
for(i=0;i<n;i++)
{
if(s[i].num==s[i+1].num&&s[i].len==s[i+1].len&&s[i].wide==s[i+1].wide)
continue;//这段代码是根据题意将长方形各个组员元素的数据都一样是进行删重
printf("%d %d %d\n",s[i].num,s[i].len,s[i].wide);
}
}
return 0;
}
-
下面这个是第二个代码
-
<2>
-
#include<stdio.h>
#include<stdlib.h>
#define MAXN 1000
struct Node
{
int num;
int len;
int wide;
};
int cmp(const void *c,const void *d)//通用类型 (必须要经过强制转换才能用)
{
Node *a=(Node*)c;//转化类型
Node *b=(Node*)d;
if(a->num!=b->num)
return a->num-b->num;
else if(a->len!=b->len)
return a->len-b->len;
else
return a->wide-b->wide;
}
int main()
{
int T,i,j,n,temp;
Node s[MAXN];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d%d",&s[i].num,&s[i].len,&s[i].wide);
if(s[i].len<s[i].wide)
{
temp=s[i].len;
s[i].len=s[i].wide;
s[i].wide=temp;
}
}
printf("\n");
//sort(s,s+n,cmp);
qsort(s,n,sizeof(0),cmp);
for(i=0;i<n;i++)
{
if(s[i].num==s[i+1].num&&s[i].len==s[i+1].len&&s[i].wide==s[i+1].wide)
continue;
printf("%d %d %d\n",s[i].num,s[i].len,s[i].wide);
}
/*for(i=1;i<m;i++)//筛掉相同的
{
if(!(s[i].num==s[i-1].num && s[i].len==s[i-1].len && s[i].wid==s[i-1].wid))
printf("%d %d %d\n",s[i].num,s[i].len,s[i].wid);
}*/
}
return 0;
} -
-
这两个代码的不同之处时候用的排序函数不同
-
第一个代码用的是sort函数
-
第二个用的是qsort函数
-
现在我们一起讨论下这两个函数的不同点是什么:
-
1.sort和qsort所需要调用的头文件就是不一样的
-
sort 需要调用#include<algorithm> ,using namespace std;
-
qsort 函数包含在#include<stdio.h>函数里面
-
2.在调用的时候
-
sort(数组名,长度,函数名字); eg:sort(a,a+n,cmp);n 就是你在以上代码中输入的有多少个长方形要进行比较
-
qsort(数组名,直接大小,需要安排的类型大小,函数名字) eg:qsort(a,n,sizeof(0),cmp);此时的sizeof(0)==sizeof(Node)
-
3,在cmp函数中,他们两个的返回式子也不一样,前者返回的是eg :return x<y; 代表的是要升序排列
-
后者返回的是 return x-y;是升序
-
qsort(a,n,sizeof(0),cmp):参数a是需要排序的目标数组的开始地址
-
n是目标数组元素个数
-
sizeof()是目标数组的 每一个元素长度
-
cmp:函数指针,指向比较函数
-
qsort(a,1000,sizeof(int),comp);其中comp函数应写为:1234
int
comp(
const
void
*a,
const
void
*b)
{
return
*(
int
*)a-*(
int
*)b;
}
上面是由小到大排序,return *(int *)b - *(int *)a; 为由大到小排序。
-
注意qsort()的cmp函数要自己写
-
但是sort()默认睡觉哦升序排列,如果想让他降序排列可以使用自己编写的cmp函数
-
能用sort就不要用qsort函数
-
第一行有一个整数 0<n<10000,表示接下来有n组测试数据;