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 
#include 

//内部排序算法用冒泡实现
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)