C标准库中是否有可用的库函数来进行排序?
C标准库中是否有可用的库函数来进行排序?
Answers:
qsort()
是您要寻找的功能。您可以使用指向数据数组的指针,该数组中元素的数量,每个元素的大小以及一个比较函数来调用它。
它发挥了魔力,并且您的数组已就地排序。下面是一个示例:
#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;
}
return (f > s) - (f < s);
qsort
函数“中,第4点”如果两个元素比较相等,则它们在所得排序数组中的顺序未指定。“
C / C ++标准库<stdlib.h>
包含qsort
函数。
这不是世界上最好的快速排序实现,但是它足够快且非常容易使用... qsort的正式语法是:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
您唯一需要实现的是compare_function,它接受两个类型为“ const void”的参数,可以将其转换为适当的数据结构,然后返回这三个值之一:
1.比较整数列表:
可简单地把A和B,如果整数x < y
,x-y
是消极的,x == y
,x-y = 0
,x > y
,x-y
是积极
x-y
的捷径办法做到这一点:)逆转*x - *y
,以*y - *x
在减少排序/逆序
int compare_function(const void *a,const void *b) {
int *x = (int *) a;
int *y = (int *) b;
return *x - *y;
}
2.比较字符串列表:
为了比较字符串,您需要strcmp
在<string.h>
lib 内部使用函数。
strcmp
默认情况下将适当地返回-ve,0,ve ...以相反的顺序排序,只需反转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.根据一个键比较记录:
有时您需要对更复杂的内容进行排序,例如记录。这是使用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;
}
int
,传递给比较器的值都int *
伪装为void *
。char *
因此,在对数组进行排序时,传递给比较器的值都char **
伪装成void *
。因此,正确的代码需要为:int compare_function(const void *a,const void *b) { return (strcmp(*(char **)a, *(char **)b)); }
。
if (x > y) return +1; else if (x < y) return -1; else return 0;
,或者如果您想要一个简单的表达式,则选择return (x > y) - (x < y);
。这总是在C级别评估两个比较,但是优化程序可能会避免这种情况。减法不适用于无符号值。第一个版本在处理一系列比较时效果很好—首先比较结构的2个整数成员,如果相等,则比较两个双精度,然后比较两个字符串,等等。有多种方法可以实现,在C和Perl中。
可以肯定的是: qsort()
是一种排序的实现(不一定像它的名字所暗示的那样是quicksort)。
试试man 3 qsort或在http://linux.die.net/man/3/qsort上阅读
qsort
不必使用Quicksort来实现。
虽然不是完全在标准库中,但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]; * /
这应该至少是标准库的两倍qsort
,因为它不使用函数指针,并且有许多其他排序算法选项可供选择。
它在C89中,因此基本上应该在每个C编译器中都可以工作。
qsort()
在中使用<stdlib.h>
。
@paxdiablo该qsort()
功能符合ISO / IEC 9899:1990(``ISO C90'')。
中提供了几种C排序功能stdlib.h
。您可以man 3 qsort
在unix机器上进行操作以获取它们的列表,但它们包括: