C库函数来执行排序

C库函数来执行排序,c,sorting,C,Sorting,在C标准库中是否有任何库函数可用于排序 在stdlib.h中有几个C排序函数可用。您可以在unix计算机上执行man 3 qsort,以获得它们的列表,但它们包括: 堆 快速分类 合并排序 在stdlib.h中尝试qsort。可以肯定:qsort()是排序的一种实现(不一定如其名称所示的快速排序) 请尝试man 3 qsort,或阅读您正在寻找的函数。您可以使用指向数据数组的指针、数组中的元素数、每个元素的大小和比较函数来调用它 它发挥了它的魔力,你的数组被排序到位。例如: #include

在C标准库中是否有任何库函数可用于排序

stdlib.h
中有几个C排序函数可用。您可以在unix计算机上执行
man 3 qsort
,以获得它们的列表,但它们包括:

  • 快速分类
  • 合并排序

在stdlib.h中尝试
qsort

可以肯定:
qsort()
是排序的一种实现(不一定如其名称所示的快速排序)

请尝试man 3 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;
}
#包括
#包括
内部组件(常数无效*elem1,常数无效*elem2)
{
int f=*((int*)elem1);
int s=*((int*)elem2);
如果(f>s)返回1;
如果(f
中使用
qsort()

@帕西迪亚布洛
qsort()
函数符合ISO/IEC 9899:1990(`ISO C90')。

C/C++标准库
包含
qsort
函数

这并不是世界上最好的快速排序实现,但它足够快而且非常简单 易于使用。。。qsort的形式语法为:

qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
2。比较字符串列表

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;
}
要比较字符串,您需要
库中的
strcmp
函数。
strcmp
将默认返回-ve,0,ve。。。要按相反的顺序排序,只需反转strcmp返回的符号即可

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

虽然不完全在标准库中,但它只有两个头文件,您可以包括这两个头文件,以访问各种难以置信的快速排序路由,如下所示:

#定义排序名称int64 #定义排序类型int64 #定义排序(x,y)((x)-(y)) #包括“sort.h” /*您现在可以访问int64_quick_sort、int64_tim_sort等,例如*/ int64_快速排序(arr,128);/*假设您有一些int*arr或int-arr[128]*/ 这应该至少是标准库
qsort
的两倍,因为它不使用函数指针,并且有许多其他排序算法选项可供选择


它在C89中,因此基本上可以在每个C编译器中使用。

我想您正在寻找
qsort

qsort
函数是在
C/C++
中的
stdlib.h
中找到的快速排序算法的实现

以下是调用
qsort
函数的语法:

void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *));
参数列表:

base:指向数组的第一个元素或基址的指针
nmemb:数组中的元素数
大小:每个元素的大小(以字节为单位)
比较:比较两个元素的函数

下面是一个使用
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;
}
#包括
#包括
int arr[]={33,12,6,2,76};
//比较函数,比较两个元素
整数比较(常数void*num1,常数void*num2){
如果(*(int*)num1>*(int*)num2)
返回1;
其他的
返回-1;
}
int main(){
int i;
printf(“排序数组之前:\n”);
对于(i=0;i<5;i++){
printf(“%d”,arr[i]);
}
//呼叫qsort
qsort(arr,5,sizeof(int),比较);
printf(“\n对数组排序后:\n”);
对于(i=0;i<5;i++){
printf(“%d”,arr[i]);
}
返回0;
}
您可以在Linux/Mac终端中键入
man 3 qsort
,以获取有关
qsort
的详细信息

heapsort和mergesort不在标准中。quicksort也不在标准中。该标准不强制要求使用哪种算法。
qsort
不必使用快速排序来实现。如果将来更改类型,您确实应该使用sizeof(*x),但提供样本时使用+1。在一般情况下,尝试通过从一个整数减去另一个整数来比较整数将导致溢出。最好从一开始就远离那个坏习惯。使用
return(f>s)-(f好,根据大多数建议更改。我画了一条线,@ChrisL,在需要大小时,因为我的数组从来没有那么大:-)并且,@AndreyT,虽然这种黑客很聪明,但我更喜欢我的代码可读:-)@paxdiablo:“黑客”是一个公认的习惯用法。任何一个称职的程序员都会立即意识到这一点。它对可读性没有负面影响。@JAamish ISO C99标准N1256,在“7.20.5.2
qsort
函数”第4点“如果两个元素比较相等,它们在结果排序数组中的顺序是未指定的。”这是一个很好的答案,但对比较函数返回值的解释是反向的。另外,在一些例子中,你在做x-y技巧,这可能会给出错误的结果(比简单的比较不明显)。。这适用于每场比赛;)如果x和y之间的差值大于可表示的最大整数,那么x-y技巧就不起作用。因此,比较两个正数时可以,但比较失败,例如,int_MAX和-10。尽管我喜欢所有不同类型排序的示例,但是我还是选择了Up。除了整数比较器和键比较器函数中的溢出问题,字符串比较函数是不正确的。对
int
数组进行排序时,传递给比较器的值都是
int*
伪装成
void*
。因此,对
char*
数组进行排序时,传递给比较器的值都是
char**
伪装为
void*<
void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *));
#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;
}