C库函数做sorting

C标准库中有没有库函数可以进行sorting?

qsort()是你正在寻找的function。 您可以使用指向您的数据数组的指针,该数组中元素的数量,每个元素的大小以及比较函数来调用它。

它有它的魔法,你的数组是在原地sorting的。 一个例子如下:

 #include <stdio.h> #include <stdlib.h> int comp (const void * elem1, const void * elem2) { int f = *((int*)elem1); int s = *((int*)elem2); if (f > s) return 1; if (f < s) return -1; return 0; } int main(int argc, char* argv[]) { int x[] = {4,5,2,3,1,0,9,8,6,7}; qsort (x, sizeof(x)/sizeof(*x), sizeof(*x), comp); for (int i = 0 ; i < 10 ; i++) printf ("%d ", x[i]); return 0; } 

C / C ++标准库<stdlib.h>包含qsort函数。

这不是世界上最好的快速sorting实现,但它足够快,很容易被使用… qsort的forms语法是:

 qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function); 

唯一需要实现的是compare_function,它接受两个types为“const void”的参数,可以将其转换为适当的数据结构,然后返回以下三个值之一:

  • 否定的,如果a应该在b之前
  • 0,如果a等于b
  • 积极的,如果一个应该在B之后

1.比较整数列表

如果x < yxy是负数, x == yxy = 0x > yxy是正数xy是一个快捷方式,那么只需将a和b转换为整数:) reverse *x - *y to *y - *x用于按递减顺序sorting

 int compare_function(const void *a,const void *b) { int *x = (int *) a; int *y = (int *) b; return *x - *y; } 

2.比较string列表

为了比较string,你需要在<string.h> lib中使用strcmp函数。 strcmp会默认返回-ve,0,ve适当的…按相反的顺序sorting,只是反转strcmp返回的符号

 #include <string.h> int compare_function(const void *a,const void *b) { return (strcmp((char *)a,(char *)b)); } 

3.比较浮点数字

 int compare_function(const void *a,const void *b) { double *x = (double *) a; double *y = (double *) b; // return *x - *y; // this is WRONG... if (*x < *y) return -1; else if (*x > *y) return 1; return 0; } 

4.比较基于密钥的logging

有时你需要sorting一个更复杂的东西,如logging。 这是使用qsort库来完成的最简单的方法。

 typedef struct { int key; double value; } the_record; int compare_function(const void *a,const void *b) { the_record *x = (the_record *) a; the_record *y = (the_record *) b; return x->key - y->key; } 

当然: qsort()是一个sorting的实现(不一定像名称可能提示的快速sorting)。

尝试man 3 qsort或阅读http://linux.die.net/man/3/qsort

在stdlib.h中尝试qsort

在stdlib中使用qsort()。

@paxdiablo qsort()函数符合ISO / IEC 9899:1990(“ISO C90”)。

虽然不是完全在标准库中,但是https://github.com/swenson/sort只有两个头文件,您可以使用这些头文件来访问各种令人难以置信的快速分类工作,如下所示:;

 #define SORT_NAME int64
 #define SORT_TYPE int64_t
 #define SORT_CMP(x,y)((x) - (y))
 #include“sort.h”
 / *您现在可以访问int64_quick_sort,int64_tim_sort等,例如* /
 int64_quick_sort(arr,128);  / *假设你有一些int * arr或int arr [128];  * /

这应该至less是标准库qsort两倍,因为它不使用函数指针,并有许多其他sortingalgorithm选项可供select。

这是在C89,所以应该在基本上每个C编译器工作。

stdlib.h有几个可用的Csortingfunction。 您可以在unix机器上进行man 3 qsort以获取它们的列表,但它们包括:

  • 堆sorting
  • 快速sorting
  • 归并sorting