【问题标题】:Using qsort with a define struct将 qsort 与定义结构一起使用
【发布时间】:2016-10-12 21:11:03
【问题描述】:

我正在学习 C,我正在解决 this challenge,我不打算将它提交到 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 函数感到困惑,我正在调用称为数组的结构,然后是输入的大小,然后使用 sizeof(int) 但我是否需要使用 int 或 sizeof 我的结构,最后我调用我的比较函数。我的代码是:

#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;
}

【问题讨论】:

  • 您忘记了#include &lt;stdlib.h&gt;,这无济于事。请最大化编译器警告。

标签: c algorithm struct qsort


【解决方案1】:

您的cmp 函数需要定义为int (*)(const void *, const void *) 才能为qsort 工作。

您执行比较的方式也不正确。来自 qsort 的手册页:

比较函数必须返回一个小于、等于、 或大于零,如果第一个参数被认为是 分别小于、等于或大于第二个。如果 两个成员比较相等,他们在排序数组中的顺序是 未定义。

您正在进行的比较返回 &lt;&gt; 运算符的结果,即 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;
  }
}

对于qsort的调用,你需要给它一个数组元素的大小,即整个结构,而不是子字段的大小:

qsort(array,n,sizeof(struct Dolls),cmp);

编辑:

修复了参数名称的错误。还更改了执行排序的方式以符合比较函数的行为方式。

【讨论】:

  • 我知道我需要更改它才能接受任何类型的输入,但是当我更改它时收到此警告:使用不同类型重新定义“a”:“const struct Dolls *” vs 'const void *'
  • 哦,我发现变量名 a 在单个范围内使用了两次的错误。更改 const struct Dolls *va = a,修正错误。
  • 比较好得多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多