【问题标题】:Built in functions for sorting arrays in C用于在 C 中对数组进行排序的内置函数
【发布时间】:2012-07-17 14:35:11
【问题描述】:

C 编程语言中是否有用于排序数组的内置函数?还是我必须自己编写函数?

【问题讨论】:

  • qsort in stdlib.h
  • @nhahtdh 不要将其发布为答案?
  • @triclosan:写 1 条内线评论比写一个完整的答案更省力。
  • 不相关,但bsearch(3) 是另一个与qsort(3) 相同的libc 例程,很多人都不知道。 (通常,它们一起使用:您需要在二进制搜索之前对数组进行排序。=))

标签: c arrays function sorting built-in


【解决方案1】:

查看 qsort

语法:

#include <stdlib.h>
void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );

说明:

qsort() 函数使用 Quicksort 对 buf (包含 num 个项目,每个大小大小)进行排序。 compare 函数用于比较 buf 中的项目。如果第一个参数小于第二个参数,compare 应该返回负数,如果它们相等则返回零,如果第一个参数大于第二个参数则返回正数。 qsort() 按升序对 buf 进行排序。

【讨论】:

  • 注意:qsort() 不一定是快速排序。 (但通常是这样)
【解决方案2】:

您可以在stdlib.h 中使用qsort它是快速排序算法,平均时间复杂度为 O(nlogn),最坏情况复杂度为 O(n2)。 C99 standard 甚至更新的C11 Standard 不要求函数的实现或时间复杂度。但是,常见的实现很可能会使用产生平均情况 O(nlogn) 时间复杂度的算法(这对于通过比较进行排序是最佳的)。

您可以使用它对任何类型的数组进行排序(甚至是struct) - 但您必须提供一个比较函数来比较数组的两个元素。

【讨论】:

  • 注意:qsort() 不一定是快速排序。 (但通常是这样)
  • 你现在可以链接到C11 Standard :)
【解决方案3】:

qsort 众所周知。还有其他的,如堆排序、合并排序等。请查看链接了解更多详情。

请注意,它们都将比较函数作为输入,这使得它们可以轻松地与原生数据类型以及用户创建的数据类型一起使用。

【讨论】:

  • 我很好奇存在哪些标准库mergesortheapsort... 原来它们在FreeBSD 的libc 中。凉爽的。 +1(注意:它们似乎不存在于 glibc 中。)
  • 它们是非标准的 C 函数。
【解决方案4】:

是的:qsort。它在stdlib.h

【讨论】:

    【解决方案5】:
     #include <stdio.h> 
     #include <stdlib.h> 
    
      // This function is used in qsort to decide the relative order 
      // of elements at addresses p and q. 
      int comparator(const void *p, const void *q) 
       { 
          return (*(int*)p-*(int*)q);
          } 
    
      // A utility function to print an array 
      void printArr(int arr[], int n) 
      { 
         int i; 
         for (i = 0; i < n; ++i) 
         printf("%d ", arr[i]); 
      }  
    
      // Driver program to test above function 
      int main() 
      { 
         int arr[] = {1, 6, 5, 2, 3, 9, 4, 7, 8, 0}; 
         int size = sizeof(arr) / sizeof(arr[0]); 
         qsort((void*)arr, size, sizeof(arr[0]), comparator); 
         printf("Output array is\n"); 
         printArr(arr, size);  
         return 0; 
       } 
    

    【讨论】:

      【解决方案6】:

      语法简单:

      int function (const void * a, const void * b) {return ( *(int*)a-(int*)b);}
      `qsort(arr_name , sizeofarray , sizeof(int), function);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-29
        • 1970-01-01
        • 2021-12-13
        • 2011-04-23
        • 2013-12-24
        • 2013-08-05
        • 2016-04-19
        相关资源
        最近更新 更多