C库函数做排序

时间:2009-11-24 05:29:20

标签: c sorting

C标准库中是否有可用于排序的库函数?

8 个答案:

答案 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”的参数,可以转换为适当的数据结构,然后 返回以下三个值中的一个:

  • 否定,如果a应该在b
  • 之前
  • 0,如果等于b
  • 正面,如果a应该在b
  • 之后

<强> 1。比较整数列表:

简单地将a和b转换为整数 如果x < yx-y为否定,则x == yx-y = 0x > yx-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