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

一、qosrt函数介绍

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

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

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第1张图片

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

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

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

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

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

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

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

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第2张图片或者:参数可写可不写

compar函数的用法 

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

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

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第3张图片



二、qsort使用举例

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

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第4张图片

或者:


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

#include 
//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;
}

注意:

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第5张图片

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第6张图片

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;
}

步骤一:按照年龄比较

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第7张图片

我们监控一下未排序时:

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第8张图片

 

 按照年龄比较    排序过后的    【C】语言 qsort使用举例 及 qsort函数的模拟实现_第9张图片


srtcmp函数:

我们认识一下ta

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

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

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第10张图片【C】语言 qsort使用举例 及 qsort函数的模拟实现_第11张图片

步骤二:按照名字比较

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第12张图片

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第13张图片

监控一下未排序时:

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第14张图片

 

 按照name比较    排序过后的 

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第15张图片

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

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

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

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

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第16张图片

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第17张图片

三、qsort函数的模拟实现

使⽤回调函数,模拟实现qsort(采⽤冒泡的⽅式)。
注意:这⾥第⼀次使⽤ void* 的指针,讲解 void* 的作⽤。
#include 
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 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函数整型数组的比较

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第18张图片

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第19张图片

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

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第20张图片

注意:

【C】语言 qsort使用举例 及 qsort函数的模拟实现_第21张图片

你可能感兴趣的:(c语言,算法,开发语言)