c语言 qsort排序

参考原文点这里

一、函数原型
c语言 qsort排序
其中第一个参数 void* base是传入一个数组,size_t num为数组整体大小,size_t size 为单个元素的大小,int (compar)(const void,const void*)是需要使用者去完成的一个比较函数

针对这个函数,在不同类型的数组中需要用不同的处理方式,来保证数组中的元素大小不会失真(例如在处理double型的数组时就需要用不同的方式来进行)

比较函数有三个返回值,分别为 >0,<0,0

二、不同类型的数据

1.int类型数据

//qsort函数
#include <stdio.h>
#include<stdlib.h>
//qsort函数实现int型排序
//qosrt函数的使用者得实现一个比较函数
int int_cmp(const void * p1, const void * p2)
{
    return (*( int *)p1 - *(int *) p2);
}

int main()
{
    int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
    qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
    for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}

2.对char类型数组排序

//qosrt函数实现char型排序
#include<stdio.h>
#include<stdlib.h>
int char_cmp(const void* str1, const void* str2)
{
    return *(char*)str1 - *(char*)str2;
}

int main()
{
    char str[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
    qsort(str, sizeof(str) / sizeof(str[0]), sizeof(char), char_cmp);
    for (int i = 0; i < sizeof(str) / sizeof(str[0]); ++i)
    {
        printf("%d ", str[i]);
    }

    return 0;
}

3.对double类型数组排序(需特别注意)

//qosrt函数实现double型排序
#include<stdio.h>
#include<stdlib.h>
int double_cmp(const void* arr1, const void* arr2)
{
    return *(double*)arr1 > *(double*)arr2 ? 1 : -1;
    //注意这里是用比较大小的方法,来返回正负
}

int main()
{
    double arr[] = { 1.4, 3.9, 5.4, 5.2, 9, 2, 4, 6, 8, 0 };
    qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(double), double_cmp);
    for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
    {
        printf("%f ", arr[i]);
    }

    return 0;
}

4.对结构体一级排序

#include<stdio.h>
#include<stdlib.h>

typedef struct Student
{
    int x;
    int y;
    //按照x从小到大排序,当x相等时按照y从大到小排序
}Student;

Student student[7];

int cmp(const void *a, const void *b)
{
    Student* pa1 = (Student*)a;
    Student* pa2 = (Student*)b;

    return (pa1->x) > (pa2->x) ? 1 : -1;
}

//展示一下对于结构体里赋值的后的结果
void Display()
{
    for (int i = 0; i < 7; ++i)
    {
        printf("%d\n",student[i].x);
    }
}

int main()
{
    int arr[7] = { 1,3,5,2,6,9,7 };
    for (int i = 0; i < 7; ++i)
    {
        //将数组arr中的元素赋值给结构体x中
        student[i].x = arr[i];
    }
    Display();
    qsort(student, 7, sizeof(Student), cmp);
    for (int i = 0; i < 7; ++i)
    {
        printf("%d", student[i].x);
    }

    return 0;
}

5.对结构体二级排序

#include<stdio.h>
#include<stdlib.h>

typedef struct Student
{
    int x;
    int y;
    //按照x从小到大排序,当x相等时按照y从大到小排序
}Student;

Student student[7];

int cmp(const void *a, const void *b)
{
    Student* pa1 = (Student*)a;
    Student* pa2 = (Student*)b;

    if (pa1->x != pa2->x)
    {
        return (pa1->x) > (pa2->x) ? 1 : -1;
    }
    else
    {
        return (pa1->y) > (pa2->y) ? 1 : -1;
    }
}

//展示一下对于结构体里赋值的后的结果
void Display()
{
    printf("x=");
    for (int i = 0; i < 7; ++i)
    {
        printf("%d", student[i].x);
    }
    printf("\n");
    printf("y=");
    for (int i = 0; i < 7; ++i)
    {
        printf("%d", student[i].y);
    }
    printf("\n");
}

int main()
{
    int arr[7] = { 1,3,5,2,6,9,7 };
    for (int i = 0; i < 7; ++i)
    {
        //将数组arr中的元素赋值给结构体x中
        student[i].y = arr[i];
    }
    Display();
    printf("排序结构体中的y:\n");
    qsort(student, 7, sizeof(Student), cmp);
    for (int i = 0; i < 7; ++i)
    {
        printf("%d", student[i].y);
    }

    return 0;
}
上一篇:C语言库函数---qsort


下一篇:c语言qsort的使用