C库qsort()的简单模拟实现

Posted _Camille

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C库qsort()的简单模拟实现相关的知识,希望对你有一定的参考价值。

qsort():

void qsort( void * base, size_t num, size_t width, int (__cdecl * compare )(const void * elem1, const void * elem2 ) );

qsort()函数的功能是对base数组(元素类型不限)进行排序

参数解释:
base :需要排序的数组的起始地址,暨数组名;
num :数组的元素个数;
width :数组中每个元素所占的字节数;
int (__cdecl * compare )(const void * elem1, const void * elem2 ) :返回值为int型,参数为两个void* 型的比较两个任意类型数据的函数指针。

无返回值


模拟:

#include <stdio.h>
#include <string.h>

//内部排序算法用冒泡实现
void swap(char *buf1, char *buf2, int width)
{
	for (int i = 0; i < width; i++)
	{
		//按字节进行交换
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}

int compare(const void *elem1, const void *elem2)
{
	//int型排序(升序)
	/*return (*(int*)elem1) - (*(int*)elem2);*/
	//char型排序(升序)
	//return (*(char*)elem1) - (*(char*)elem2);
}


void my_qsort(void* base,
	size_t num,
	size_t width,
	int(*compare)(const void *elem1, const void *elem2))
{
	for (int i = 0; i < num - 1; ++i)
	{
		for (int j = 0; j < num - i - 1; ++j)
		{
			if (compare(((char*)base) + j*width, ((char*)base) + (j + 1)*width)>0)
			{
				//交换数据;
				swap(((char*)base) + j*width, ((char*)base) + (j + 1)*width, width);
			}
		}
	}
}


试例:

`

	int arr[5] = { 2, 3, 8, 1, 0 };
	my_qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), compare);
	for (int i = 0; i < 5; ++i)
	{
		printf("%d ", arr[i]);
	}

在这里插入图片描述

	char arr1[5] = { 'e', 'd', 'a', 'c', 'b'};
	my_qsort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), compare);
	for (int i = 0; i < 5; ++i)
	{
		printf("%c ", arr1[i]);
	}

在这里插入图片描述

以上是关于C库qsort()的简单模拟实现的主要内容,如果未能解决你的问题,请参考以下文章

C语言篇 + 指针进阶练习 + qsort模拟实现(回调函数思想) + 指针和数组笔试题

模拟实现qsort atoi函数,小白快来看

模拟实现qsort atoi函数,小白快来看

手撕C语言标准库qsort(自我实现简化高效版C风格泛型快排)

C语言之qsort函数进行排序

C语言--回调函数实列 模拟qsort函数