✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦!!✨✨✨✨
文章目录
- ✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦!!✨✨✨✨
- qsort的介绍:
- 一、qsort函数的使用✨
- 比较int类型数据
- 比较字符型数据
- 比较结构体数据
- 冒泡思想模拟实现qsort函数
- 完结
qsort的介绍:
- qsort ()函数是 C 库中实现的快速排序算法,包含在 stdlib.h 头文件中
- 此函数需要四个参数void qsort(void* *base, size_t nitems, size_t size, int (compar)(const void * , const void))
- char* base —— 指向要排序的数组首元素地址的指针
- size_t nitems —— 要排序数组的元素个数
- size_t size —— 数组每个元素大的小 (有非常重要的作用)
- int compar(const void *,const void *) —— 由使用者提供的一个比较两个元素的函数
- 有两个参数,如果参数1大于参数2返回>0的数
- 参数1等于参数2返回0
- 参数1小于参数2返回<0的数
- 使用void*当作参数类型是因为此函数是一个回调函数,我们并不知道使用函数的人要比较哪两种数据,所有把参数设置成void *让使用者可以比较任意一种数据。(详细见下面配上代码分解:使用冒牌排序思想模拟实现qsort)
3.此函数无返回值
一、qsort函数的使用✨
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void *arr1,const void *arr2)//提供按照int比较函数,如果参数1大于参数2返回>0的数,参数1等于参数2返回0,参数1小于参数2返回<0的数
{
return *(int *)arr1 - *(int*)arr2;
}
int main()
{
int arr[10] = { 4,3,5,6,7,8,1,2,9,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int width = sizeof(arr[0]);
qsort(arr, sz, width, cmp_int);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]); //0 1 2 3 4 5 6 7 8 9
}
printf("\n");
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmp_char(const void* str1,const void* str2) //提供按照字符比较函数,如果参数1大于参数2返回>0的数,参数1等于参数2返回0,参数1小于参数2返回<0的数
{
return *(char*)str1 - *(char*)str2;
}
int main()
{
char str[10] = { 'g','c','b','d','f','e','a' };
int len = strlen(str);
int width2 = sizeof(str[0]);
qsort(str, len, width2, cmp_char);
printf("%s", str); //abcdefg
printf("\n");
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct a
{
char name[10];
int age;
};
int cmp_stru_a_name(const void * arr3,const void *arr4) //按照name排序比较方法
{
return strcmp(((struct a*)arr3)->name ,((struct a*)arr4)->name);
}
int cmp_stru_a_age(const void* arr1, const void* arr2) //按照age排序比较方法
{
return ((struct a*)arr1)->age - ((struct a*)arr2)->age;
}
int main()
{
struct a arr2[] = { {"baobao",2} ,{"aoligei",4}{"caomei",3}};
int sz2 = sizeof(arr2)/sizeof(arr2[0]);
int width3 = sizeof(arr2[0]);
qsort(arr2, sz2, width3, cmp_stru_a_name); //按照结构体中name排序
for (int i = 0; i < sz2; i++)
{
printf("%s ", arr2[i].name);
printf("%d ", arr2[i].age);
}
printf("\n"); //aoligei 4 baobao 2 caomei 3
qsort(arr2, sz2, width3, cmp_stru_a_age); //按照结构体中age排序
for (int i = 0; i < sz2; i++)
{
printf("%s ", arr2[i].name);
printf("%d ", arr2[i].age);
} //baobao 2 caomei 3 aoligei 4
}
冒泡思想模拟实现qsort函数
qsort底层使用的是快速排序,我们使用冒泡排序思想模拟实现效果与qsort相同的函数
冒泡排序:每次把最大的一个数字交换到最后面
void swap(char* arr1, char* arr2,int width)
{
for (int i = 0; i < width; i++)
{
char* temp = *arr1;
*arr1 = *arr2;
*arr2 = temp;
arr1++;
arr2++;
}
}
int cmp_int(const void* arr1, const void* arr2) //提供比较函数
{
return *(int*)arr1 - *(int*)arr2;
}
void bubble_sort(void *base,size_t sz,size_t width,int (*cmp)(const void*,const void*))
{
for (int i = 0; i < sz - 1; i++)
{
for (int j = 0; j < sz - i - 1; j++)
{
if (cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)
//由于设计bubble_sort函数的时候我们还不知道使用者想比较什么类型的数据,所有可以把base强制转换成字符型指针再乘上元素宽度进行比较,使得无论传入的是什么类型的数据都可以比较。
{
swap((char*)base+j*width,(char*)base+(j+1)*width,width);
//使用swap交换的时候也是如此,我们设计bubble_sort函数的时候不知道要对多少个字节进行交换,所以用把base强转成char*和宽度一起传入swap中,一个字节一个字节的进行交换
------
##
}
}
}
}
int main()
{
int arr[10] = { 3,1,2,4,5,9,7,6,8,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int width = sizeof(arr[0]);
bubble_sort(arr, sz, width, cmp_int);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]); //打印结果:0 1 2 3 4 5 6 7 8 9
}
}
由于设计bubble_sort函数的时候我们还不知道使用者想比较什么类型的数据,所有可以把base强制转换成字符型指针再乘上元素宽度进行比较,使得无论传入的是什么类型的数据都可以比较。
使用swap交换的时候也是如此,我们设计bubble_sort函数的时候不知道要对多少个字节进行交换,所以用把base强转成char*和宽度一起传入swap中,一个字节一个字节的进行交换
拿int类型举例
完结
创作不易,还请各位小伙伴多多点赞👍关注✨收藏⭐