C 将qsort与define结构一起使用
我在学习C,我在解决问题,我不打算把它提交给uva平台,我编写这个练习的原因是为了学习,也许不是解决问题的最佳方法,但我正在尝试 我在终端中打印的输入如下:C 将qsort与define结构一起使用,c,algorithm,struct,qsort,C,Algorithm,Struct,Qsort,我在学习C,我在解决问题,我不打算把它提交给uva平台,我编写这个练习的原因是为了学习,也许不是解决问题的最佳方法,但我正在尝试 我在终端中打印的输入如下: 4 3 20 30 40 50 30 40 Res: 2 4 20 30 10 10 30 20 40 50 Res: 4 3 10 30 20 20 30 10 Res: 2 4 10 10 20 30 40 50 39 51 Res: 3 每个输入测试的答案都不正确,我相信原因是qsort函数。我对如何使用结构来使用qsort函数感
4
3
20 30 40 50 30 40
Res: 2
4
20 30 10 10 30 20 40 50
Res: 4
3
10 30 20 20 30 10
Res: 2
4
10 10 20 30 40 50 39 51
Res: 3
每个输入测试的答案都不正确,我相信原因是qsort函数。我对如何使用结构来使用qsort函数感到困惑,我调用了名为array的结构,后跟输入的大小,然后使用sizeof(int),但我是否需要使用int或sizeof我的结构,最后我调用了compare函数。我的代码是:
#include <stdio.h>
#include <string.h>
struct Dolls{
int w;
int h;
}array[20005];
int cmp(struct Dolls a, struct Dolls b){
if(a.w==b.w){
return a.h < b.h;
}else{
return a.w > b.w;
}
}
int arr[20005];
int dp[20005];
int n;
int bSearch(int num, int k){
int low=1;
int high = k;
int mid;
while(low<= high){
mid = (low+high)/2;
if(num>=dp[mid]){
low=mid+1;
}else{
high=mid-1;
}
}
return low;
}
int res_dolls(){
int k=1;
int i,pos;
dp[i]=arr[1];
for(i=2;i<=n;i++){
if(arr[i]>=dp[k]){
dp[++k] = arr[i];
}else{
pos = bSearch(arr[i],k);
dp[pos] = arr[i];
}
}
return k;
}
int main(){
int t,j;
scanf("%d",&t);
while(t--){
memset(array,0,sizeof(array));
scanf("%d",&n);
for(j=1;j<=n;j++){
scanf("%d %d",&array[j].w, &array[j].h);
}
qsort(array,n,sizeof(int),cmp);
for(j=1;j<=n;j++){
arr[j] = array[j].h;
}
printf("%d\n",res_dolls());
}
return 0;
}
#包括
#包括
结构娃娃{
int w;
int-h;
}数组[20005];
int cmp(结构娃娃a、结构娃娃b){
如果(a.w==b.w){
返回a.hb.w;
}
}
国际农业研究所[20005];
int dp[20005];
int n;
int b搜索(int num,int k){
int低=1;
int高=k;
int mid;
而(低=dp[中]){
低=中+1;
}否则{
高=中-1;
}
}
低回报;
}
int res_玩偶(){
int k=1;
int i,pos;
dp[i]=arr[1];
对于(i=2;i=dp[k]){
dp[++k]=arr[i];
}否则{
pos=b搜索(arr[i],k);
dp[pos]=arr[i];
}
}
返回k;
}
int main(){
int t,j;
scanf(“%d”、&t);
而(t--){
memset(数组,0,sizeof(数组));
scanf(“%d”和“&n”);
对于(j=1;j您的cmp
函数需要定义为int(*)(const void*,const void*)
才能用于qsort
您执行比较的方式也不正确。从qsort的手册页:
比较函数必须返回小于、等于、,
或者,如果第一个参数被认为是
分别小于、等于或大于第二个。如果
如果两个成员相等,则它们在排序数组中的顺序为
未定义
您正在进行的比较将返回
运算符的结果,即0或1。您需要明确检查每种情况并返回正确的值
int cmp(const void *va, const void *vb){
const struct Dolls *a = va;
const struct Dolls *b = vb;
if(a->w > b->w) {
return 1;
} else if(a->w < b->w){
return -1;
} else if(a->h > b->h) {
return 1;
} else if(a->h < b->h){
return -1;
} else {
return 0;
}
}
编辑:
修复了参数名称的错误。还更改了排序的执行方式,以符合比较函数的行为方式。您的
cmp
函数需要定义为int(*)(const void*,const void*)
,才能用于qsort
您执行比较的方式也不正确。从qsort的手册页:
比较函数必须返回小于、等于、,
或者,如果第一个参数被认为是
分别小于、等于或大于第二个。如果
如果两个成员相等,则它们在排序数组中的顺序为
未定义
您正在进行的比较将返回
运算符的结果,即0或1。您需要明确检查每种情况并返回正确的值
int cmp(const void *va, const void *vb){
const struct Dolls *a = va;
const struct Dolls *b = vb;
if(a->w > b->w) {
return 1;
} else if(a->w < b->w){
return -1;
} else if(a->h > b->h) {
return 1;
} else if(a->h < b->h){
return -1;
} else {
return 0;
}
}
编辑:
修复了参数名称的错误。还更改了排序的执行方式,以符合比较函数的行为方式。您忘记了
\include
,这没有帮助。请最大化编译器警告。您忘记了\include
,这没有帮助。请最大化编译器警告。我知道需要更改它以接受任何类型的输入,但当我更改它时,我收到以下警告:“const struct Dolls*”与“const void*”重新定义“a”。哦,我发现了错误,变量名a在一个范围内使用了两次。更改const struct Dolls*va=a,修复了错误。更好地比较!我理解了首先,我需要更改它以接受任何类型的输入,但当我更改它时,我收到以下警告:“const struct Dolls*”与“const void*”重新定义“a”。哦,我发现了错误,变量名a在一个范围内使用了两次。更改const struct Dolls*va=a,修复了错误。更好的比较!