C语言做题常用排序函数-qsort

文章目录

一、qsort介绍

二、qsort详解

三、类型

Int

double

字符

字符串

四、实例代码

一、qsort介绍

原型:void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));

Cplusplus中的解释:

对数组的元素进行排序

对数组中由 指向的元素进行排序,每个元素字节长,使用该函数确定顺序。

此函数使用的排序算法通过调用指定的函数来比较元素对,并将指向它们的指针作为参数。

该函数不返回任何值,但通过重新排序数组的元素(如 所定义)来修改指向的数组的内容。

等效元素的顺序未定义。


二、qsort详解

头文件:#include<stdlib.h>
原型:void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*))

base :可为数组,也可为指针(注:此指针应指向数组);

size_t num:数组长度,根据cplusplus定义,他为unsigned int

size_t size:数组元素所占字节,据cplusplus定义,他为unsigned int

compare:指向比较两个元素的函数的指针。
重复调用此函数以比较两个元素。它应遵循以下原型:qsort

int compar (const void* p1, const void* p2);

即他也可以为一个函数名.

代码如下(示例):

/* qsort example */#include <stdio.h>      
/* printf */#include <stdlib.h>     /* qsort */
int values[] = { 40, 10, 100, 90, 20, 25 };
int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}//此处为整形递增排序
int main ()
{
  int n;
  qsort (values, 6, sizeof(int), compare);
  for (n=0; n<6; n++)
     printf ("%d ",values[n]);
  return 0;
}

重点:

此函数最主要的部分其实在于int (*compar)(const void*,const void*);

因为主要改变的都在在个部分,包括数据类型以及升降序.而其他部分其实就按照规则填入便可.其中size_t size可用sizeof()来计算其中一个数组元素大小便可


三、类型

Int

int compare (const void * a, const void * b)
{
return *(double*)a >*(double *)b ? 1 : -1;//升序
return *(double*)a <*(double *)b ? 1 : -1;//降序
}

double

int compare (const void * a, const void * b)
{
return *(double*)a >*(double *)b ? 1 : -1;//升序
return *(double*)a <*(double *)b ? 1 : -1;//降序
}

字符

int compare (const void * a, const void * b)
{
   return *(char *)a - *(char *)b;//升序
return *(char *)b - *(char *)a;//降序
}

字符串

int compare (const void * a, const void * b)
{
return strcmp(*(const char**)a, *(const char**)b);//升序
return strcmp(*(const char**)b, *(const char**)a);//降序   
}

四、实例代码

#include <stdio.h>      
#include <stdlib.h>     /* qsort */

//Int
int compare1(const void* a, const void* b)
{
    return (*(int*)a - *(int*)b);//升序
    //return ( *(int*)b - *(int*)a );//降序
}

//Double
int compare2(const void* a, const void* b)
{
    return *(double*)a > *(double*)b ? 1 : -1;//升序
    //return *(double*)a < *(double*)b ? 1 : -1;//降序
}

//字符
int compare3(const void* a, const void* b)
{
    return *(char*)a - *(char*)b;//升序
    //return *(char*)b - *(char*)a;//降序
}

//字符串
int compare4(const void* a, const void* b)
{
    return strcmp(*(const char**)a, *(const char**)b); // 升序
    //return strcmp(*(const char**)b, *(const char**)a);//降序   
}

int main()
{
    int values1[] = { 40, 10, 100, 90, 20, 25 };
    double values2[] = {1.2,0.42,0.2,8,3.14,15.2};
    char values3[] = { 'e', 's', 'a', 'w', 'k', 'l' };
    char* values4[] = { "nobody","everything","anything","nonthing","anybody","something" };
    int n;

    qsort(values1, 6, sizeof(int), compare1);
    qsort(values2, 6, sizeof(double), compare2);
    qsort(values3, 6, sizeof(char), compare3);
    qsort(values4, 6, sizeof(char*), compare4);

    printf("Int:");
    for (n = 0; n < 6; n++)
        printf("%d ", values1[n]);
    printf("\n");

    printf("double:");
    for (n = 0; n < 6; n++)
        printf("%.2lf ", values2[n]);
    printf("\n");

    printf("字符:");
    for (n = 0; n < 6; n++)
        printf("%c ", values3[n]);
    printf("\n");

    printf("字符串:");
    for (n = 0; n < 6; n++)
        printf("%s ", values4[n]);
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_64038246/article/details/130535965