一、函数原型
其中第一个参数 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;
}