[Lenguaje C] función qsort

ordenar

Función : realiza una ordenación rápida.

参数:void qsort( void * base , size_t num , size_t width , int (*cmp )(const void * e1 , const void * e2 ) );

Archivo de encabezado : #include <stdlib.h>

uso :

El primer parámetro es la dirección del primer elemento de la matriz que se va a ordenar.

El segundo parámetro es el número de datos a ordenar.

El tamaño de cada parámetro en los terceros datos en cola, en bytes

El cuarto es escribir una función para determinar qué datos a ordenar son grandes y cuáles son pequeños. Las reglas son las siguientes

Un puntero de tipo void* puede recibir cualquier tipo de dirección

El puntero de tipo void* no se puede desreferenciar (el byte de acceso es incierto)

Un puntero de tipo void* no puede realizar operaciones de suma y resta en números enteros

Primero veamos una aplicación simple y sus resultados.

1. tipo int

#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
    //比较两个整型类型
    return *(int*)e1 - *(int*)e2;
}
int main()
{
    int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, sz, sizeof(arr[0]), cmp_int);
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}

 

●Vea aquí, esto es en orden ascendente, si desea descender en orden descendente , devuelva directamente *(int*)e2-*(int*)e1; 

●Para mayor comodidad, recordamos el tipo de prueba test para cada tipo, por ejemplo, el tipo int es test1, etc.

2. tipo de flotador

int cmp_float(const void* e1, const void* e2)
{
    return *(float*)e1 - *(float*)e2;
}
void test2()
{
    float f[] = { 9.0,8.0,7.0,5.0,4.0 };
    int sz = sizeof(f) / sizeof(f[0]);
    qsort(f, sz, sizeof(f[0]), cmp_float);
    int j = 0;
    for (j = 0; j < sz; j++)
    {
        printf("%f ", f[j]);
    }
}
int main()
{
test2();
return 0;
}

3. tipo de estructura

Dado que los miembros de la estructura struct pueden tener muchos tipos, solo doy un ejemplo relativamente simple aquí. Los miembros de la estructura solo contienen el nombre y la edad. Use qsort para ordenar por edad y por nombre

struct Stu 
{
    char name[20];
    int age;
};

edad de la estructura

int cmp_Stu_by_age(const void*e1,const void*e2)
{
    return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}

void test3()
{
    struct Stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",18} };
    int sz = (sizeof(s) / sizeof(s[0]));
    qsort(s, sz, sizeof(s[0]), cmp_Stu_by_age);
    int z = 0;
    for (z = 0; z < sz; z++)
    {
        printf("%s %d", s[z].name,s[z].age);
    }
}
int main()
{
test3();
return 0;
}

nombre-estructura

int cmp_Stu_by_name(const void* e1, const void* e2)
{
    return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
void test4()
{
    struct Stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",18} };
    int sz = (sizeof(s) / sizeof(s[0]));
    qsort(s, sz, sizeof(s[0]), cmp_Stu_by_name);
    int z = 0;
    for (z = 0; z < sz; z++)
    {
        printf("%s %d", s[z].name,s[z].age);
    }
}
int main()
{
test 4();
return 0;
}

 Hay un punto a tener en cuenta aquí, la función strcmp debe usarse para comparar cadenas y la resta no se puede realizar directamente.

 Bueno, esta vez la función qsort ha terminado, dale un pulgar hacia arriba.

Supongo que te gusta

Origin blog.csdn.net/weixin_60478154/article/details/123167986
Recomendado
Clasificación