C语言qsort函数详解

目录

一、qsort函数的使用

二、qsort函数的模拟


一、qsort函数的使用

快排函数qsort是C的库函数,它可以对输入的任何类型的数组排序,通过该函数的函数声明我们可以看出它的使用方法:

C语言qsort函数详解_第1张图片

 

 举个栗子:

#include
#include
#include

int cmp1(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

int cmp2(const void* e1, const void* e2)
{
	return *(char*)e1 - *(char*)e2;
}

int main()
{
	int arr1[] = { 2,4,1,5,3,7 };
	size_t num1 = sizeof(arr1) / sizeof(arr1[0]);
	size_t sz1 = sizeof(arr1[0]);

	char arr2[] = "kstnhmlw";
	size_t num2 = strlen(arr2);
	size_t sz2 = sizeof(char);

    //整型数组排序
	qsort(arr1, num1, sz1, cmp1);  
	for (size_t i = 0; i < num1; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");

    //字符型数组排序
	qsort(arr2, num2, sz2, cmp2);  
	printf("%s\n", arr2);

	return 0;
}

二、qsort函数的模拟

qsort函数最大的特点是对任意类型数组排序,要实现这一点只要采用和qsort函数声明一样的数据类型即可。在这里,qsort函数的排序方法我们使用冒泡排序。

//qsort函数的模拟
void Swap(char* n1, char* n2, size_t width)
{
	//一个字节一个字节的交换
	for (size_t i = 0; i < width; i++)
	{
		char tmp = *(n1 + i);
		*(n1 + i) = *(n2 + i);
		*(n2 + i) = tmp;
	}
}
void my_qsort(void* base, size_t num, size_t width, int (*cmp)(const void* e1, const void* e2))
{
	size_t i = 0;
	size_t j = 0;
	for (i = 0; i < num - 1; i++)
	{
		for (j = 0; j < num - 1 - i; j++)
		{
			//实现从小到大的排序
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}

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