【问题标题】:QSORT on array in C?在C中的数组上进行QSORT?
【发布时间】:2011-11-14 07:03:01
【问题描述】:

如果我有这样的数组:

2, 4, 6, 0, 0, 0, 0, 0, 0
  1. 有没有一种方法可以使用 qsort,只对前 3 个元素进行排序,而其余的元素保持不变?
  2. qsort(arrNumbers, 3, sizeof(int), compare) 会做这项工作吗?
  3. 是否指定小于整个数组的元素数量只会导致该数量的元素被排序?

编辑: 我的比较功能是:

int comp(const int * a, const int * b)
   if(a==b)
   {
       return 0;
   }
   else
   {
      if(a<b)
      {
         return -1;
       }
       else
       {
         return 1;
       }
    }

看起来对吗?

【问题讨论】:

  • 这是一个新颖的想法:把它放在一个 C 程序中,看看会发生什么!
  • the manpage 说什么?
  • 你试过了吗?它应该可以工作,而且不难尝试。
  • 致经验主义者:问题在于,如果考虑到可能的 UB,尝试并不能证明任何事情。任何“证据”都可能是巧合。我会说标准文档更强大
  • 仅仅尝试是不够的。它表明也许它是按设计工作的,也许有未定义的行为在任何地方巧合地导致程序输出预期的答案,也许还有其他东西。所以了解背景是很好的,尤其是在使用 C 或 C++ 时。

标签: c arrays sorting


【解决方案1】:

是的。

是的。*

是的。


* 假设您适当地定义了compare()

【讨论】:

  • 这是一个很棒的(病态)警告!
【解决方案2】:

您为什么不尝试一下,看看它是否如您所愿?

解释:qsort 函数只得到一个指向数组的指针,它并没有说明数组有多长。这就是为什么你也必须传递大小。在您的函数调用中,您声称该数组是三个ints 长,这就是qsort 函数可以确定的所有内容。它不会访问超出该限制的任何内容。

【讨论】:

    【解决方案3】:

    完整的签名是:

    void qsort(
       void * base,
       size_t num,
       size_t width,
       int (__cdecl *compare )(const void *, const void *) 
    );
    

    要对数组的特定连续范围进行排序,您只需传入不同的base(指向该范围的起始元素的指针)和num(该范围内的元素数) .

    【讨论】:

      【解决方案4】:

      是的,如果您在您的情况下指定 3,它只会对前 3 个元素进行排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-21
        • 2021-07-16
        • 2011-03-30
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        • 2012-08-26
        • 1970-01-01
        相关资源
        最近更新 更多