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

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

一、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;
}

相关文章
|
7天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
1天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
3天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
3天前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
|
3天前
|
C语言
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
|
6天前
|
安全 C语言
【C语言】strcpy与strncpy函数的使用和模拟实现
【C语言】strcpy与strncpy函数的使用和模拟实现
5 0
|
6天前
|
C语言
【C语言】字符分类函数与字符转换函数
【C语言】字符分类函数与字符转换函数
9 1
|
6天前
|
程序员 编译器 C语言
C语言之函数与参数
C语言之函数与参数
5 0
|
7天前
|
C语言
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
|
7天前
|
机器学习/深度学习 C语言
函数递归深入解析(C语言)
函数递归深入解析(C语言)