加粗样式
作者:@黑眼圈ing
机电专业 工科男
CSDN@黑眼圈ing
每天进步一点点!
前言
qsort函数是C语言函数库中自带的排序函数,可以实现对数组、字符串、结构体等数据进行升序或降序排序,qsort函数包含在C标准库–<stdlib.h>
qsort函数的特点:1.快速排序的方法 quick 2.适合于任意类型数据的排序
先赞后看,养成习惯! ! ! ^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持是我坚持的动力。点赞后不要忘了关注我哦!
一、qsort()用法
void qsort (void* base, size_t num, size_t size, int (compar)(const void,const void*));
1.base——指向需要排序数组的第一个元素
2.num——需要排序的个数
3.size——元素的大小,单位是字节
4.int (compar)(const void,const void*)——函数指针类型—这个函数指针所指向的函数,能比较base指向数组中两个元素
二、qsort()使用
1.int型数据排序(默认升序)
qsort实现整形数据排序
int cmp_int(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)(p2);
}
void test1()
{
int arr[] = { 3,4,6,8,7,5,1,2,9,0};
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
}
int main()
{
test1();
//test2();
//test3();
return 0;
}
2.struct型数据排序
//qsort实现结构体排序——by-name
struct stu
{
char name[20];
int age;
};
int cmp_struct_by_name( const void* p1, const void* p2)
{
return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}
void test2()
{
struct stu arr1[] = { {"nirongyang",18},{"guzhijie",30},{"cuiyuanbo",19}};
int sz = sizeof(arr1) / sizeof(arr1[0]);
qsort(arr1, sz, sizeof(arr1[0]), cmp_struct_by_name);
}
int main()
{
//test1();
test2();
//test3();
return 0;
}
//qsort实现结构体排序——by-age
struct stu
{
char name[20];
int age;
};
int cmp_struct_by_age(const void* p1,const void* p2)
{
return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void test3()
{
struct stu arr1[] = { {"nirongyang",18},{"guzhijie",30},{"cuiyuanbo",19} };
int sz = sizeof(arr1) / sizeof(arr1[0]);
qsort(arr1,sz,sizeof(arr1[0]),cmp_struct_by_age);
}
int main()
{
//test1();
//test2();
test3();
return 0;
}
3.char型数据排序
//qsort实现char型数据排序
int cmp_char(const void* p1,const void* p2)
{
return *(char*)p1 - *(char*)p2;
}
void test()
{
char str[] = "fedcba";
int sz = sizeof(str) / sizeof(str[0]);
int i = 0;
printf("排序前:");
for (i = 0; i < sz; i++)
{
printf("%c",str[i]);
}
printf("\n");
qsort(str,sz,sizeof(str[0]),cmp_char);
printf("排序后:");
for (i = 0; i < sz; i++)
{
printf("%c", str[i]);
}
}
int main()
{
test();
return 0;
}
三、模拟实现qsort()
1->冒泡排序
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
//趟数
for (i = 0; i < sz - 1; ++i)
{ //两两相邻元素比较交换
int j = 0;
for (j = 0; j < sz - 1 - i; ++j)
{ //默认排序为升序
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
2-> bubble_sort();
1.使用冒泡排序的思想
2.对任意数据类型排序
// bubble_sort模拟实现qsort
void bubble_sort(void* base,int num,int size,int (*cmp)(const void*,const void*))
{
int i= 0;
//趟数
for (i = 0; i < num-1; i++)
{
int j = 0;
for (j = 0; j <num-1-i; j++)
{ //默认升序,如果cmp大于0,说明arr[j]>arr[j+1],交换
if (cmp((char*)base + j * size, (char*)base + (j + 1) * size)>0)
{
//交换
swap((char*)base + j * size,(char*)base + (j + 1) * size,size);
}
}
}
}
void swap(char* p1,char* p2,int size)
{
int i = 0;
char tmp = 0;
for (i = 0; i < size; i++)
{
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
p1++;
p2++;
}
}
1.int型数据排序
int cmp_int(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
//整形数据排序
void test1()
{
int arr[] = { 4,3,6,8,7,5,1,2,9,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
}
int main()
{
test1();//整形数据排序
//test2();
//test3();
return 0;
}
2.struct型数据排序
//排序结构体数据--by--name
struct stu
{
char name[20];
int age;
};
int cmp_struct_by_name(const void* p1,const void* p2)
{
return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}
void test2()
{
struct stu arr1[] = { {"nirongyang",18},{"guzhijie",30},{"cuiyuanbo",19} };
int sz = sizeof(arr1) / sizeof(arr1[0]);
bubble_sort(arr1,sz,sizeof(arr1[0]),cmp_struct_by_name);
}
int main()
{
//test1();
test2();//排序结构体数据—by-name
//test3();
return 0;
}
//排序结构体数据——by—age
int cmp_struct_by_age(const void* p1,const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
void test3()
{
struct stu arr1[] = { {"nirongyang",18},{"guzhijie",30},{"cuiyuanbo",19} };
int sz = sizeof(arr1) / sizeof(arr1[0]);
bubble_sort(arr1, sz, sizeof(arr1[0]), cmp_struct_by_age);
}
int main()
{
//test1();//排序int型数据
//test2();//排序struct型数据—by—name
test3();//排序struct型数据—by—age
3.char型数据排序
//bubble_sort实现char型数据排序
void bubble_sort(void* base, int num, int size, int (*cmp)(const void*, const void*))
{
int i = 0;
//趟数
for (i = 0; i < num - 1; i++)
{
int j = 0;
for (j = 0; j < num - 1 - i; j++)
{ //默认升序,如果cmp大于0,说明arr[j]>arr[j+1],交换
if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
{
//交换
swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
}
}
}
}
int cmp_char(const void* p1,const void* p2)
{
return *(char*)p1 - *(char*)p2;
}
void test()
{
char str[] = "fedcba";
int sz = sizeof(str) / sizeof(str[0]);
int i = 0;
printf("排序前:");
for (i = 0; i < sz; i++)
{
printf("%c",str[i]);
}
printf("\n");
bubble_sort(str,sz,sizeof(str[0]),cmp_char);
printf("排序后:");
for (i = 0; i < sz; i++)
{
printf("%c", str[i]);
}
}
int main()
{
test();
return 0;
}
总结
上述就是关于C语言----qsort()用法+冒泡排序模拟实现qsort()
欢迎各位大佬评论,如果有哪里有错误的地方,还请各位大佬指出,我会虚心接受的!!!
每天进步一点儿!!!
感谢大佬们的支持!!!感谢大佬们的支持!!!感谢大佬们的支持!!!