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 < y
, xy
是负数, x == y
, xy = 0
, x > y
, xy
是正数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