在学习使用过qsort之后,一直在想是否能用其他的排序算法去模拟实现它的功能,把自己的实现写出来,也是对自己的一种总结吧。
因为模拟是实现qsort,实现原理与qsort基本相同所以,给出和它一样的参数列表。
void BubbleSortNoType(void *arr, int dataNum, int typeSize, Fun fun)//数组地址,元素个数,元素类型大小,比较函数
typedef int(*Fun)(void *, void *);
void BubbleSortNoType(void *arr, int dataNum, int typeSize, Fun fun)
{
if (NULL == arr)
{
return;
}
int idx = 0;
int jdx = 0;
for (idx = 0; idx < dataNum - 1; idx++)
{
int Ischange = 0;//避免无用循环
for (jdx = 0; jdx < dataNum - idx - 1; jdx++)
{
//内部一个字节一个字节的处理
char* FirValue = (char *)arr + jdx * typeSize;
char* SecValue = (char *)arr + (jdx + 1) * typeSize;
if (fun(FirValue, SecValue))
{
int x = typeSize;
while (x)
{
char tmp = *FirValue;
*FirValue = *SecValue;
*SecValue = tmp;
FirValue++, SecValue++;
x--;
}
Ischange = 1;
}
}
if (!Ischange)
{
break;
}
}
}
int Great(void *left, void *right)//比较函数的一个例子
{
return *((char *)left) >= *((char *)right);
}
测试实例:
int GreatChar(void *left, void *right)//比较函数
{
return *((char *)left) >= *((char *)right);
}
int GreatInt(void *left, void *right)//比较函数
{
return *((int *)left) >= *((int *)right);
}
int GreatDouble(void *left, void *right)//比较函数
{
return *((double *)left) >= *((double *)right);
}
int main()
{
char array[] = "gfedcba";
Fun fun = GreatChar;
BubbleSortNoType(array, strlen(array), sizeof(array[0]), fun);
int arrayint[] = { 1, 9, 3, 0, 5, 7, 6, 8, 2, 4, 4, 5, 6 };
fun = GreatInt;
BubbleSortNoType(arrayint, sizeof(arrayint) / sizeof(arrayint[0]), sizeof(arrayint[0]), fun);
double arraydouble[] = { 1, 2.1, 5.4, 5.6, 5.8, 4.3, 6.9, 1.5, 9.9 };
fun = GreatDouble;
BubbleSortNoType(arraydouble, sizeof(arraydouble) / sizeof(arraydouble[0]), sizeof(arraydouble[0]), fun);
system("pause");
return 0;
}
排序成功