C标准库中是否有可用于排序的库函数?
答案 0 :(得分:106)
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;
}
答案 1 :(得分:55)
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
lib中的<string.h>
函数。
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;
}
答案 2 :(得分:7)
可以肯定:qsort()
是一种排序的实现(不一定是名称可能暗示的快速排序)。
尝试man 3 qsort或阅读http://linux.die.net/man/3/qsort
答案 3 :(得分:5)
虽然不完全在标准库中,https://github.com/swenson/sort只有两个头文件,您可以包含这些文件以访问各种令人难以置信的快速排序路由,如下所示:
#define SORT_NAME int64 #define SORT_TYPE int64_t #define SORT_CMP(x, y) ((x) - (y)) #include "sort.h" /* You now have access to int64_quick_sort, int64_tim_sort, etc., e.g., */ int64_quick_sort(arr, 128); /* Assumes you have some int *arr or int arr[128]; */
这应该至少是标准库qsort
的两倍,因为它不使用函数指针,并且有许多其他排序算法选项可供选择。
它在C89中,所以基本上应该在每个C编译器中工作。
答案 4 :(得分:4)
在stdlib.h中尝试qsort
。
答案 5 :(得分:4)
在qsort()
中使用<stdlib.h>
。
@paxdiablo
qsort()
函数符合ISO / IEC 9899:1990(“ISO C90”)。
答案 6 :(得分:3)
stdlib.h
中有几种C排序功能。您可以在unix机器上执行man 3 qsort
以获取它们的列表,但它们包括:
答案 7 :(得分:3)
我认为您正在寻找qsort
。
qsort
函数是在 stdlib.h
中的 C/C++
中找到的快速排序算法的实现。
以下是调用 qsort
函数的语法:
void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *));
参数列表:
base:指向数组首元素或基地址的指针
nmemb:数组中元素的数量
size:每个元素的大小(以字节为单位)
compar:比较两个元素的函数
这是一个使用 qsort
对数组进行排序的代码示例:
#include <stdio.h>
#include <stdlib.h>
int arr[] = { 33, 12, 6, 2, 76 };
// compare function, compares two elements
int compare (const void * num1, const void * num2) {
if(*(int*)num1 > *(int*)num2)
return 1;
else
return -1;
}
int main () {
int i;
printf("Before sorting the array: \n");
for( i = 0 ; i < 5; i++ ) {
printf("%d ", arr[i]);
}
// calling qsort
qsort(arr, 5, sizeof(int), compare);
printf("\nAfter sorting the array: \n");
for( i = 0 ; i < 5; i++ ) {
printf("%d ", arr[i]);
}
return 0;
}
您可以在 Linux/Mac 终端中输入 man 3 qsort
以获取有关 qsort
的详细信息。
Link to qsort man page