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模拟实现(回调函数思想) + 指针和数组笔试题