【C】语言 qsort使用举例 及 qsort函数的模拟实现

目录

一、qosrt函数介绍

compar函数的用法 

二、qsort使用举例

1.使⽤qsort函数排序整型数据

2.使⽤qsort排序结构数据

步骤一:按照年龄比较

​编辑

srtcmp函数:

步骤二:按照名字比较

总结qsort函数的用法与冒泡对比

三、qsort函数的模拟实现

步骤一:

bubble_sort2模拟qsort函数对整型数组的比较

步骤二:bubble_sort模拟qsort函数对结构体数组的比较


一、qosrt函数介绍

qsort 是一个库函数,可以直接使用 ;头文件(Stdlib.h)

qsort 的实现是使用快速排序算法来排序的

void qsort (void* base,//待排序的数组的起始位置

                  size_t num,//待排序的数组的元素个数

                  size_t size,//待排序的数组的元素大小

                  int (*compar)(const void*p1,const void*p2))://函数指针

                  //该函数指针指向的是一个函数

                  //指向的函数是用来比较待排序数组中的两个元素的

                  //p1指向一个元素,p2也指向一个元素

或者:参数可写可不写

compar函数的用法 

这个函数是由函数的使用者提供~

注意p1 p2的位置,和比大小关系<0,=0,>0;



二、qsort使用举例

我们把qsort基本用法搬下来方便对照一下

或者:


1.使⽤qsort函数排序整型数据

#include <stdio.h>
//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 };
 int i = 0;
 
 qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);
 for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)
 {
 printf( "%d ", arr[i]);
 }
 printf("\n");
 return 0;
}

注意:

2.使⽤qsort排序结构数据

struct Stu //学⽣
{
 char name[20];//名字
 int age;//年龄
};
//假设按照年龄来⽐较
int cmp_stu_by_age(const void* e1, const void* e2)
{
 return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//strcmp - 是库函数,是专⻔⽤来⽐较两个字符串的⼤⼩的
//假设按照名字来⽐较
int cmp_stu_by_name(const void* e1, const void* e2)
{
 return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//按照年龄来排序
void test2()
{
 struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
 int sz = sizeof(s) / sizeof(s[0]);
 qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
}
//按照名字来排序
void test3()
{
 struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
 int sz = sizeof(s) / sizeof(s[0]);
 qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{
 test2();
 test3();
 return 0;
}

步骤一:按照年龄比较

我们监控一下未排序时:

 

 按照年龄比较    排序过后的    


srtcmp函数:

我们认识一下ta

他与compar函数比较用法一样,不过它适用于字符串的比较

strcmp函数 - 比较字符串
其实是按照对应位置上字符的
ASCII码值的大小比较的~

步骤二:按照名字比较

监控一下未排序时:

 

 按照name比较    排序过后的 

总结qsort函数的用法冒泡对比

1. qsort确实可以排序任意类型的数据
2学会qsort怎么使用

3.qsort在使用的时候,需要使用这传递一个函数的地址

这个函数用来比较待排序的数组中的2个元素按照参数和返回值的要求实现就行

三、qsort函数的模拟实现

使⽤回调函数,模拟实现qsort(采⽤冒泡的⽅式)。
注意:这⾥第⼀次使⽤ void* 的指针,讲解 void* 的作⽤。
#include <stdio.h>
int int_cmp(const void * p1, const void * p2)
{
 return (*( int *)p1 - *(int *) p2);
}
void _swap(void *p1, void * p2, int size)
{
 int i = 0;
 for (i = 0; i< size; i++)
 {
 char tmp = *((char *)p1 + i);
 *(( char *)p1 + i) = *((char *) p2 + i);
 *(( char *)p2 + i) = tmp;
 }
}
void bubble(void *base, int count , int size, int(*cmp )(void *, void *))
{
 int i = 0;
 int j = 0;
 for (i = 0; i< count - 1; i++)
 {
 for (j = 0; j<count-i-1; j++)
 {
 if (cmp ((char *) base + j*size , (char *)base + (j + 1)*size) > 0)
 {
 _swap(( char *)base + j*size, (char *)base + (j + 1)*size, size);
 }
 }
 }
}
int main()
{
 int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
 int i = 0;
 bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);
 for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)
 {
 printf( "%d ", arr[i]);
 }
 printf("\n");
 return 0;
}

步骤一:

bubble_sort2模拟qsort函数整型数组的比较

步骤二:bubble_sort模拟qsort函数结构体数组的比较

注意:

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尚尚.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值