qsort函数--手把手剖析其使用与模拟实现

目录

一. 前言

二 . 正文

 1.头文件 

2.参数

3. 返回值

4. 简单实验

5. 模拟实现qsort函数-- 整型排序功能(用冒泡排序)

三.  结语


一. 前言

       前面我们学过冒泡排序,但我们发现操作不太便利,而今天要给大家分享库函数中,可以给任何数据的数组排序的qsort函数。

二 . 正文

 1.头文件 

  #include<stdlib.h>

 下面是qsort函数的声明:

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

2.参数

void * base :    需要排序数组的第一个元素地址

size_t nitems : 数组元素的个数

size_t size   :   单位元素的字节大小

int (*compar)(const void *, const void*) : 自定义的函数指针,函数的行参是两个数据空指针,函数的返回值是int,后面会解释。

(注:由于是空指针定义,如 void *a,   那么a 无法解引用,并且不能a++,  因为计算机无法判断数据类型和数据大小。)

3. 返回值

空返回值

4. 简单实验

1.排int类型自定义函数

其中的自定义函数为int 返回值,因为qsort函数通过自定义函数判断,换句话说,自定义函数是在编写比较方法

     代码如下:


// 自定义函数
int swap(const void* x, const void* y)
{
	//这里对数字大小升序
	return (*(int*)x - *(int*)y); // 计算机不知道x, y数据类型,因此强制转化
}

2.排结构体类型 ----  字符串自定义函数

typedef struct Data {
	char* name;
	int age;
	int score;
	char class;
}Da;

// 字符串
int rank_name(const void* x, const void* y) // 降序升序更改一下x,y位置即可
{
	return strcmp( ((Da*)x)->name, ((Da*)x)->name );
}

3.排结构体类型 ----  字符自定义函数

typedef struct Data {
	char* name;
	int age;
	int score;
	char class;
}Da;

// 整型
int rank_age(const void* x, const void* y) // 降序升序更改一下x, y位置即可
{
	return (((Da*)x)->age - ((Da*)y)->age);
}

5. 模拟实现qsort函数-- 整型排序功能(用冒泡排序)

代码如下:

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

这里对交换函数补充讲解:

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

代码图解

三.  结语

      感谢小伙伴的浏览,如果有什么建议欢迎到评论区评论。

猜你喜欢

转载自blog.csdn.net/qq_72112924/article/details/129861055